วิธีการรับตัวเลขก่อนคำบางคำโดยใช้ regex ใน c #?


10

เราจะใช้ regex ด้านล่างเพื่อรับตัวเลขก่อนคำ

ตัวอย่าง:

838123 บางคำ 8 บางคำ 12 บางคำ

(\d+)\s*someWord

แต่บางครั้งจะมีอะไรเกิดขึ้นระหว่าง Number และ word โปรดดูตัวอย่างบรรทัดด้านล่าง

Ex:

43434 ของ mallord 12 สิ่งใด ๆ ที่ordord 2323 new mallord

วิธีการรับตัวเลขที่แน่นอนก่อนที่คำว่าใช้ regex?

กรุณาให้คำแนะนำของคุณ


3
ดูเหมือนว่าโพสต์ที่มีอยู่จะตอบคำถามของคุณ กรุณาแจ้งให้ answerers และผู้อ่านในอนาคตรู้ว่าถ้าคุณได้รับคำตอบของประโยชน์ (พาทัวร์ ) มิฉะนั้นโปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังมองหาและทำไมคำตอบไม่เหมาะกับกรณีของคุณ
Reza Aghaei

1
ไม่ชัดเจนในสิ่งที่คุณถาม ...
23419

คำตอบ:


14

ทำเช่นนี้:

(\d+)[^\d]+some[wW]ord

คุณต้องยอมรับสิ่งอื่นนอกจากตัวเลขหลักเอง ฉันก็ถือว่าทั้งสองwและWเนื่องจากตัวอย่างของคุณมีทั้ง

การสาธิต


คุณกำลังมองหาคำตอบอื่นอยู่หรือไม่?
Reza Aghaei

@RezaAghaei อาจ
CinCout

ปัญหาของคำตอบปัจจุบันที่คุณให้ไว้คืออะไร คุณกำลังมองหาการปรับปรุงอะไรบ้าง?
Reza Aghaei

@RezaAghaei ความจริงที่ว่า OP ไม่ยอมรับคำตอบใด ๆ เลยทำให้ฉันคิดว่าถ้าฉันพลาดมุมตัวเล็กหรือบางอย่าง แนวทางอื่นในการแก้ปัญหาก็ยินดีด้วยเช่นกัน
CinCout

1
@ CinCout-ReinstateMonica โปรดดูคำตอบของฉันสำหรับกรณีที่ไม่ได้รับขอบที่เป็นไปได้ (ไม่แน่ใจว่าเกี่ยวข้องกับ OP หรือไม่)
Steve Chambers


3

หนึ่งใน "มุมพลาดกรณี" ที่เป็นไปได้จากคำตอบของ CinCout คือถ้าการแข่งขันนั้นsomeWordต้องตรงเช่นถ้าnotsomeWordและsomeWordNotThisไม่ควรจับคู่

ส่วนขยายต่อไปนี้สำหรับนิพจน์ทั่วไปนั้นมีวิธีการแก้ไขปัญหานี้:

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

คำอธิบาย:ตัว[^\w]ก่อนหรือหลังตัวจับคู่someWordมองหา"อักขระที่ไม่ใช่คำ"ก่อนและหลังตัวอักษร - จุดสิ้นสุดของบรรทัดจะนับที่นี่ด้วย ซึ่งแน่นอนว่าอาจทำให้ซับซ้อน / เฉพาะเจาะจงมากขึ้นทั้งนี้ขึ้นอยู่กับข้อกำหนดที่แน่นอน

การสาธิต


3

คุณสามารถลองสิ่งนี้:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

คุณสามารถดูการทดสอบได้ที่นี่


3

ครั้งแรกที่แยกออกจากกันsome[wW]ord, numberและspaceมีรูปแบบแล้วดำเนินการรูปแบบที่สองเกี่ยวกับมัน

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

เมื่อดำเนินการรูปแบบแรกประโยคจะเป็นไปตามที่ต้องการ

43434 ของ mallord 12 สิ่งใด ๆ ที่ordord 2323 new mallord

เปลี่ยน:

43434 เมืองมาร์ก 12 มาร์ก 2323


2

แต่บางครั้งจะมีอะไรเกิดขึ้นระหว่าง Number และ word โปรดดูตัวอย่างบรรทัดด้านล่าง

Ex:

43434 ของ mallord 12 สิ่งใด ๆ ที่ordord 2323 new mallord

ลองนี้

(\ + D) (. *?) someword

อธิบาย

\ d + - ตัวเลข

. *? - อะไรก็ได้หลังจากตัวเลข แต่เกิดขึ้นน้อยที่สุด

เมลเบอร์ - การแข่งขันที่แน่นอนของค่อนข้าง

การสาธิต


2

การใช้\s*จะจับคู่กับอักขระช่องว่าง 0 หรือมากกว่าเท่านั้น

คุณสามารถใช้\D+แต่มันจะตรงกับบรรทัดใหม่เนื่องจากตรงกับอักขระใด ๆ ยกเว้นตัวเลข

หากคุณต้องการจับคู่ตัวเลขในบรรทัดเดียวกันคุณสามารถเพิ่มไม่ตรงกับบรรทัดใหม่ให้กับคลาสอักขระที่ไม่ได้ใช้ [^\d\r\n]

ในตัวอย่างของคุณคุณใช้\dแต่ถ้าคุณต้องการจับคู่ 1 หลักขึ้นไป0-9คุณสามารถใช้คลาสอักขระ[0-9]+

เพื่อป้องกันตัวเลขและคำที่เป็นส่วนหนึ่งของคำที่ใหญ่กว่าคุณสามารถใช้ประโยชน์จากขอบเขตของคำ \b

หากคุณต้องการจับคู่คำในลักษณะที่ไม่คำนึงถึงขนาดตัวพิมพ์คุณสามารถใช้RegexOptions.IgnoreCaseหรือตัวดัดแปลงแบบอินไลน์(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

ดูการสาธิต . NET regex


2

ใช้ Named Match Captures (เพื่อให้ได้ข้อมูลใช้mtch.Groups["Value"].Value... ฯลฯ ) เพื่อดึงข้อมูลตามที่ต้องการ

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

เมื่อข้างต้นมีการเรียกใช้ ( ด้วยIgnorePatternWhiteSpaceมิฉะนั้นลบความคิดเห็นและเข้าร่วมรูปแบบเพื่อให้ทำงานได้เช่น(?<Value>\d+)(?<Other>.+?)(?<Key>someword)มีตัวเลือก regex ไม่มี ) ที่จะได้รับข้อมูลสำหรับแต่ละข้อมูล / คู่กุญแจและจัดระเบียบในแต่ละเดี่ยวการแข่งขัน

ผลลัพธ์

นี่คือผลลัพธ์ (สำหรับตัวอย่างที่สองของคุณ) ซึ่งมีอยู่ในการแข่งขันแต่ละรายการและกลุ่มและการจับภาพของพวกเขาในแต่ละการแข่งขัน:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

เห็นนี่คือสิ่งที่จับคู่:

ป้อนคำอธิบายรูปภาพที่นี่

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