PowerShell และผู้ประกอบการที่เกี่ยวข้อง


143

พิจารณาตัวอย่างต่อไปนี้:

"12-18" -Contains "-"

คุณคิดว่าสิ่งนี้จะประเมินผลtrueแต่ก็ไม่เป็นเช่นนั้น สิ่งนี้จะประเมินfalseแทน ฉันไม่แน่ใจว่าทำไมสิ่งนี้เกิดขึ้น แต่ทำ

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้สิ่งนี้แทน:

"12-18".Contains("-")

ตอนนี้นิพจน์จะประเมินเป็นจริง

เหตุใดข้อมูลโค้ดแรกจึงมีพฤติกรรมเช่นนั้น มีอะไรพิเศษเกี่ยวกับสิ่ง-ที่ไม่ได้เล่นอย่างสวยงาม-Containsหรือ เอกสารไม่ได้พูดถึงอะไรเกี่ยวกับมัน

คำตอบ:


197

ตัว-Containsดำเนินการไม่ทำการเปรียบเทียบซับสตริงและการจับคู่ต้องอยู่ในสตริงที่สมบูรณ์และใช้เพื่อค้นหาคอลเลกชัน

จากเอกสารที่คุณเชื่อมโยงกับ:

- คำอธิบายประกอบด้วย: ผู้ประกอบการบรรจุ บอกว่าการรวบรวมค่าอ้างอิงรวมถึงค่าการทดสอบเดียวหรือไม่

ในตัวอย่างที่คุณให้มาคุณกำลังทำงานกับคอลเล็กชันที่มีรายการสตริงเพียงรายการเดียว

หากคุณอ่านเอกสารที่คุณเชื่อมโยงกับคุณจะเห็นตัวอย่างที่แสดงให้เห็นถึงพฤติกรรมนี้:

ตัวอย่าง:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

ฉันคิดว่าสิ่งที่คุณต้องการคือ-Matchผู้ดำเนินการ:

"12-18" -Match "-"

Trueซึ่งผลตอบแทน

สำคัญ:ตามที่ระบุไว้ในความคิดเห็นและในเอกสารที่เชื่อมโยงควรสังเกตว่าตัว-Matchดำเนินการใช้นิพจน์ทั่วไปเพื่อทำการจับคู่ข้อความ


14
เพื่อความสมบูรณ์ในขณะที่ - การจับคู่อาจเป็นการจับคู่ที่ดีก็ใช้ regex หากต้องการให้มีสตริงที่ไม่คลุมเครือให้ตรวจสอบหนึ่งควรทำตามที่ OP อธิบาย:"12-18".Contains("-")
8DH

4
@ 8DH - จับได้ดีมาก :) ต้องอ่านคำถามอีกครั้งฉันคิดว่าฉันต้องชี้แจงความแตกต่างระหว่างตัวContainsดำเนินการ powershell และวิธีการ.Contains() . NET String
Kev

1
ดังที่ได้กล่าวไปแล้วในความคิดเห็นข้างต้นให้-Matchใช้ regex นั่นหมายความว่าพารามิเตอร์สตริงคือ regex ไม่ใช่สตริงปกติ ตัวอย่างเช่น"hello" -Match "."จะคืนค่าจริงเนื่องจาก"."เป็น regex ที่ '.' จะจับคู่กับอักขระใด ๆ ในการตรวจสอบว่าสตริงมีการหยุดเต็มหรือไม่: "hello" -Match "\."(คืนค่าเท็จ)
malla

1
@malla - จุดดีฉันได้แก้ไขในหมายเหตุเกี่ยวกับเรื่องนี้ ขอบคุณ
Kev

นี่คือ "เพื่อนเท็จ" อย่างแน่นอน! :) การมีอยู่ของ "-contain" หมายถึง "เป็นของรายการ"
Raúl Salinas-Monteagudo

38

-Containsจริง ๆ แล้วเป็นตัวดำเนินการรวบรวม มันเป็นจริงถ้าคอลเลกชันมีวัตถุ ไม่ จำกัด เฉพาะสายอักขระ

-matchและ-imatchเป็นตัวจับคู่สตริงนิพจน์ทั่วไปและตั้งค่าตัวแปรอัตโนมัติให้ใช้กับการจับภาพ

-like, -ilikeมีแบบ SQL matchers



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.