Regex ไม่ใช่ตัวดำเนินการ


133

ไม่มีตัวดำเนินการใน Regexes หรือไม่? เช่นเดียวกับในสตริงนั้น:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

ฉันต้องการลบทั้งหมด\([0-9a-zA-z _\.\-:]*\)แต่ไม่ใช่สิ่งที่เป็นปี: (2001).

ดังนั้นสิ่งที่ regex (2001) nameควรกลับต้อง:

หมายเหตุ: สิ่งที่เหมือน\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)ไม่ได้ผลสำหรับฉัน (แต่(20019)ก็ตรงกับ ... )


1
มีสายเช่นข้างต้นเป็นและฉันต้องการ regex มันขึ้นว่าผลจากการ regex (2001) nameคือ:
Sonnenhut

คำตอบ:


125

ไม่ไม่มีตัวดำเนินการไม่ตรง อย่างน้อยก็ไม่ใช่อย่างที่หวัง

คุณสามารถใช้ Lookahead เชิงลบที่มีความกว้างเป็นศูนย์ได้อย่างไรก็ตาม:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

(?!...)ส่วนหนึ่งหมายถึง "เท่านั้นถ้าตรงกับข้อความดังต่อไปนี้ (เพราะฉะนั้น: lookahead) นี้ไม่ได้ . (เพราะฉะนั้น: ลบ) ตรงนี้ แต่มันไม่จริงใช้ตัวอักษรที่มันตรงกับ (เพราะฉะนั้น: ศูนย์กว้าง)

มีจริง 4 การรวมกันของlookaroundsมี 2 แกน:

  • lookbehind / lookahead: ระบุว่ามีการพิจารณาอักขระก่อนหรือหลังจุด
  • บวก / ลบ: ระบุว่าอักขระต้องตรงกันหรือต้องไม่ตรงกัน

ขอบคุณ?! เป็นสิ่งที่ฉันแนะนำเช่นกัน แต่อย่างไรก็ตามถ้าฉัน\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)ยังคงใช้(20019)อยู่
Sonnenhut

ในการแก้ไขคำถามของคุณคุณใส่ไว้{4} นอกผู้มองและในความคิดเห็นนี้คุณใส่ไว้ข้างใน : คุณลองทำอันไหน? นอกจากนี้: หากคุณต้องการ(20019)จับคู่คุณต้องเพิ่มคนมอง\) ข้างในของคุณ:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer

ด้วย regex ด้านบนในความคิดเห็นของคุณมันทำงานได้ แต่ฉันไม่เข้าใจว่า ... ฉันไม่เข้าใจว่าทำไมคุณถึงหลบหนีในส่วนต่อไปนี้\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)แล้วไม่มีวงเล็บปิดไม่ใช่เหรอ?
Sonnenhut

ฉันหนีจากวงเล็บปิด)เพราะฉันต้องการจับคู่อักขระตามตัวอักษร)(เช่นเดียวกับที่คุณทำในตอนต้นและตอนท้ายของ regex ของคุณ!) จากนั้นหลังจากที่ผมจับคู่นั้นผมจบ lookahead )โดยใช้ใช้ Escape
Joachim Sauer

เข้าใจแล้ว ฉันรู้สึกสับสนเล็กน้อยกับตัวละครทั้งหมดนั้น ขอขอบคุณ.
Sonnenhut

205

ไม่มากนักแม้ว่าโดยทั่วไปแล้วคุณสามารถใช้วิธีแก้ปัญหาบางอย่างกับรูปแบบใดรูปแบบหนึ่งได้

  • [^abc]ซึ่งเป็นตัวละครตัวละครไม่ได้aหรือbหรือc,
  • หรือมองในแง่ลบ: a(?!b)ซึ่งaไม่ตามมาด้วยb
  • หรือมองในแง่ลบเบื้องหลัง: (?<!a)bซึ่งbไม่ได้นำหน้าด้วยa

อ๋อผมคิดเชิงลบรูปลักษณ์ที่อยู่เบื้องหลังคือข - อ้างอิง (<หรือไม่?!): regular-expressions.info/lookaround.html
jankins

11
แต่[^abc]ควรหมายถึง not aor bหรือcไม่ใช่ "not the string abc"
ฝนตก

0

คุณสามารถจับภาพ(2001)และแทนที่ส่วนที่เหลือโดยไม่มีอะไรเลย

public static string extractYearString(string input) {
    return input.replaceAll(".*\(([0-9]{4})\).*", "$1");
}

var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)";
var result = extractYearString(subject);
System.out.println(result); // <-- "2001"

.*\(([0-9]{4})\).* หมายถึง

  • .* ตรงกับอะไรก็ได้
  • \(จับคู่(ตัวละคร
  • ( เริ่มจับภาพ
  • [0-9]{4} เลขสี่ตัวเดียว
  • ) สิ้นสุดการจับภาพ
  • \)จับคู่)ตัวละคร
  • .* อะไรก็ได้ (สตริงที่เหลือ)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.