Làm cách nào để có được các chữ số trước một số từ cụ thể bằng regex trong c #?


10

Chúng tôi sẽ sử dụng regex dưới đây để có được các chữ số trước các từ.

Thí dụ :

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

Nhưng đôi khi bất cứ điều gì sẽ đến giữa Số và từ. Vui lòng xem dòng ví dụ dưới đây.

Ví dụ:

43434 của một số thứ 12 bất cứ thứ gì đó

Làm thế nào để có được chữ số chính xác trước từ đó bằng regex?

Xin vui lòng cho tôi đề nghị của bạn.


3
Có vẻ như các bài viết hiện có trả lời câu hỏi của bạn. Xin vui lòng cho người trả lời và độc giả tương lai biết nếu bạn tìm thấy câu trả lời hữu ích (Tham quan ). Nếu không, vui lòng cung cấp thêm chi tiết về những gì bạn đang tìm kiếm và tại sao câu trả lời không phù hợp với trường hợp của bạn.
Reza Aghaei

1
Không rõ những gì bạn đang hỏi ...
JohnyL

Câu trả lời:


14

Làm cái này:

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

Bạn cần chấp nhận bất cứ điều gì khác ngoài chữ số. Ngoài ra tôi đã xem xét cả wWvì các ví dụ của bạn chứa cả hai.

Bản giới thiệu


Bạn đang tìm kiếm một câu trả lời khác nhau?
Reza Aghaei

@RezaAghaei có thể
CinCout

Các vấn đề với câu trả lời hiện tại mà bạn cung cấp là gì? Những cải tiến bạn đang tìm kiếm?
Reza Aghaei

@RezaAghaei Thực tế là OP chưa chấp nhận bất kỳ câu trả lời nào khiến tôi phải suy nghĩ nếu tôi bỏ lỡ một trường hợp góc hoặc một cái gì đó. Phương pháp thay thế để giải quyết nó cũng được hoan nghênh.
CinCout

1
@ CinCout-ReinstateMonica Vui lòng xem câu trả lời của tôi cho trường hợp cạnh bị bỏ lỡ có thể xảy ra (không chắc điều này có liên quan đến OP không).
Steve Chambers

4

Giả sử "bất cứ điều gì" không bao gồm các chữ số, bạn có thể sử dụng biểu thức chính này:

(\d+)[^\d]+someWord

Bản demo trên regex101


3

Một "trường hợp góc bị bỏ lỡ" có thể có từ câu trả lời của CinCout là nếu trận đấu someWordphải chính xác, ví dụ: nếu notsomeWordsomeWordNotThiskhông nên khớp.

Phần mở rộng sau đây cho biểu thức chính quy đó cung cấp một cách để giải quyết điều này:

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

Giải thích: Các [^\w]trước hoặc sau khi khớp cho someWordcái nhìn cho một "nhân vật không-word" trước và sau nó - dấu chấm hết của dòng cũng đếm đây. Điều này tất nhiên có thể được thực hiện phức tạp hơn / cụ thể, tùy thuộc vào các yêu cầu chính xác.

Bản giới thiệu


3

Bạn có thể thử một cái gì đó như thế này:

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

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

Bạn có thể xem thử nghiệm ở đây


3

đầu tiên tách some[wW]ord, numberspacevới một mô hình, sau đó thực hiện các mô hình thứ hai vào nó

 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();

Khi mẫu đầu tiên được thực thi, câu sẽ như mong muốn

43434 của một số thứ 12 bất cứ thứ gì đó

thay đổi:

43434 cách nào đó 12 cách nào đó 2323


2

Nhưng đôi khi bất cứ điều gì sẽ đến giữa Số và từ. Vui lòng xem dòng ví dụ dưới đây.

Ví dụ:

43434 của một số thứ 12 bất cứ thứ gì đó

thử cái này

(\ d +) (. *?)

Giải thích

\ d + - số

. *? - bất cứ điều gì sau số nhưng xảy ra tối thiểu.

đôi khi - kết hợp chính xác của một phần

Bản giới thiệu


2

Sử dụng \s*sẽ chỉ khớp 0 hoặc nhiều ký tự khoảng trắng.

Bạn có thể sử dụng \D+nhưng nó cũng sẽ khớp với các dòng mới vì nó phù hợp với bất kỳ char nào ngoại trừ một chữ số.

Nếu bạn muốn khớp các chữ số trên cùng một dòng, bạn có thể thêm không khớp dòng mới vào lớp ký tự bị phủ định [^\d\r\n]

Trong ví dụ của bạn, bạn sử dụng \d, nhưng nếu bạn chỉ muốn khớp 1 hoặc nhiều chữ số 0-9, bạn có thể sử dụng một lớp ký tự[0-9]+

Để ngăn chữ số và từ là một phần của từ lớn hơn, bạn có thể sử dụng ranh giới từ \b

Nếu bạn muốn ghép từ theo cách không phân biệt chữ hoa chữ thường, bạn có thể sử dụng RegexOptions.IgnoreCasehoặc một công cụ sửa đổi nội tuyến(?i)

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

Xem bản demo regex .NET


2

Sử dụng các Kết hợp được đặt tên (Để nhận dữ liệu, hãy sử dụng mtch.Groups["Value"].Value... vv) để trích xuất thông tin khi cần.

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

Khi phần trên được chạy ( với IgnorePatternWhiteSpacecách khác loại bỏ các nhận xét và tham gia mẫu để chạy nó, chẳng hạn như (?<Value>\d+)(?<Other>.+?)(?<Key>someword)không có tùy chọn regex ), nó sẽ lấy dữ liệu cho từng cặp Dữ liệu / Khóa và sắp xếp từng cặp trong một trận đấu.

Kết quả

Đây là kết quả (ví dụ thứ hai của bạn), tất cả được chứa trong các trận đấu riêng lẻ và các nhóm và ảnh chụp của họ cung cấp trong mỗi trận đấu:

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

Trực quan ở đây là những gì phù hợp:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.