Як отримати цифри перед певним словом, використовуючи регулярний вираз у c #?


10

Нижче ми використаємо регулярний вираз, щоб отримати цифри перед словами.

Приклад:

838123 який-небудь 8, якийсь 8, 12 якийсь

(\d+)\s*someWord

Але іноді між цифрою та словом буде що-небудь. Будь ласка, дивіться нижче приклад рядка.

Наприклад:

43434 якогось слова 12, чогось, 2323 нового

Як отримати точну цифру перед цим словом, використовуючи регулярний вираз?

Будь ласка, дайте мені свої пропозиції.


3
Схоже, наявні публікації відповідають на ваше запитання. Будь ласка, повідомте відповідей та майбутніх читачів, чи вважаєте ви відповіді корисними (Пройдіть екскурсію ). В іншому випадку, будь ласка, надайте більш детальну інформацію про те, що ви шукаєте, і чому відповіді не відповідають вашому випадку.
Реза Агхай

1
Не зрозуміло, про що ви просите ...
JohnyL

Відповіді:


14

Зробити це:

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

Вам потрібно прийняти що-небудь, крім самих цифр. Також я вважав і те, wіW оскільки ваші приклади містили обидва.

Демо


Шукаєте іншу відповідь?
Reza Aghaei

@RezaAghaei можливо
CinCout

Які проблеми з поточною відповіддю, яку ви надали? Які вдосконалення ви шукаєте?
Reza Aghaei

@RezaAghaei Той факт, що ОР ще не прийняв жодної відповіді, змушує задуматися, чи пропустив я кутовий випадок чи щось таке. Альтернативні підходи для її вирішення також вітаються.
CinCout

1
@ CinCout-ReinstateMonica Будь ласка, дивіться мою відповідь щодо можливого випадку пропущеного краю (не впевнений, чи це стосується ОП).
Стів Чемберс


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 якогось слова 12, чогось, 2323 нового

зміни:

43434 деяке слово 12 якесь слово 2323 якесь слово


2

Але іноді між цифрою та словом буде що-небудь. Будь ласка, дивіться нижче приклад рядка.

Наприклад:

43434 якогось слова 12, чогось, 2323 нового

спробуйте це

(\ d +) (. *?) якесь слово

Пояснив

\ 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


2

Використовуйте іменовані зйомки відповідності (для використання даних 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)без параметрів регулярного вираження ), він отримує дані для кожної пари Дані / Ключі та організовує кожного в одному поєднанні.

Результат

Ось результат (для вашого другого прикладу), який міститься в окремих матчах та їх групах та захопленнях, передбачених у кожному матчі:

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

Візуально ось що відповідає:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.