สตริงการจับคู่ RegExp ไม่ได้ขึ้นต้นด้วย


93

สำหรับ PMD myฉันต้องการที่จะมีกฎที่เตือนฉันของตัวแปรที่น่าเกลียดผู้ที่เริ่มต้นด้วย
ซึ่งหมายความว่าฉันต้องยอมรับตัวแปรทั้งหมดซึ่งไม่ได้myเริ่มต้นด้วย

ดังนั้นฉันต้องการ RegEx (re) ซึ่งทำงานดังนี้:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

ฉันได้ลองใช้วิธีอื่นแล้วแต่ยังไม่ได้ผล


1
ฉันคิดว่าจริงๆแล้วควรจะมองในแง่ลบ (ไม่ใช่มองไปข้างหน้าในแง่ลบ)
Indrit

คำตอบ:


43

คุณสามารถใช้การยืนยันแบบ Lookahead เหมือนที่คนอื่นแนะนำ หรือถ้าคุณต้องการใช้ไวยากรณ์นิพจน์ทั่วไปขั้นพื้นฐาน:

^(.?$|[^m].+|m[^y].*)

สิ่งนี้จับคู่สตริงที่มีความยาวเป็นศูนย์หรือหนึ่งอักขระ ( ^.?$) จึงไม่สามารถเป็นmyได้ หรือสตริงมีสองคนหรือมากกว่าตัวอักษรที่เมื่อตัวอักษรตัวแรกไม่ได้เป็นmตัวละครใด ๆ เพิ่มเติมอาจปฏิบัติตาม ( ^[^m].+); หรือถ้าอักขระตัวแรกเป็นอักขระจะmต้องไม่ตามด้วยy( ^m[^y])


นี่คือสิ่งที่เราสามารถใช้ได้ในตอนนี้ ดูเหมือนว่าจะมีปัญหากับ regexp แบบขยาย แต่อันนี้ใช้ได้ดีในตอนนี้
Dominik Sandjaja

169
^(?!my)\w+$

ควรทำงาน.

ขั้นแรกให้ตรวจสอบให้แน่ใจว่าไม่สามารถจับคู่myที่จุดเริ่มต้นของสตริงได้จากนั้นจับคู่อักขระที่เป็นตัวอักษรและตัวเลขจนกว่าจะสิ้นสุดสตริง ช่องว่างที่ใดก็ได้ในสตริงจะทำให้นิพจน์ล้มเหลว ทั้งนี้ขึ้นอยู่กับการป้อนข้อมูลของคุณคุณอาจต้องการทั้งช่องว่างในแถบด้านหน้าและด้านหลังของสตริงก่อนที่จะผ่านไปยัง regex หรือใช้เพิ่ม matchers ช่องว่างไม่จำเป็นที่จะ regex ^\s*(?!my)(\w+)\s*$เช่น ในกรณีนี้ backreference 1 จะมีชื่อของตัวแปร

และถ้าคุณต้องการให้แน่ใจว่าชื่อตัวแปรของคุณเริ่มต้นด้วยกลุ่มอักขระบางตัวให้พูด[A-Za-z_]ใช้

^(?!my)[A-Za-z_]\w*$

หมายเหตุการเปลี่ยนแปลงจากการ+*


63
/^(?!my).*/

(?!expression)เป็นคนมองโลกในแง่ลบ มันตรงกับตำแหน่งที่expression ไม่ตรงกันโดยเริ่มที่ตำแหน่งนั้น


7

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

/^my/

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