Как получить цифры перед каким-то конкретным словом с помощью регулярных выражений в C #?

10

Мы будем использовать ниже регулярное выражение, чтобы получить цифры перед словами.

Пример :

838123 SomeWord 8 SomeWord 12 SomeWord

(\d+)\s*someWord

Но иногда между словом и числом будет что-нибудь. Пожалуйста, посмотрите строку примера ниже.

Пример:

43434 Someword 12 что-нибудь Someword 2323 Новое Someword

Как получить точную цифру перед этим словом с помощью регулярных выражений?

Пожалуйста, дайте мне ваши предложения.

бала к
источник
3
Похоже, существующие посты ответят на ваш вопрос. Пожалуйста, сообщите ответчикам и будущим читателям, если вы найдете ответы на эти вопросы полезными ( совершите экскурсию ). В противном случае, пожалуйста, предоставьте более подробную информацию о том, что вы ищете и почему ответы не подходят для вашего случая.
Реза Агаи
1
Непонятно, о чем ты спрашиваешь ...
JohnyL

Ответы:

14

Сделай это:

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

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

демонстрация

CinCout
источник
Вы ищете другой ответ?
Реза Агаи
@RezaAghaei возможно
CinCout
Какие проблемы с текущим ответом, который вы предоставили? Какие улучшения вы ищете?
Реза Агаи
@RezaAghaei Тот факт, что OP еще не принял никакого ответа, заставляет меня задуматься, пропустил ли я угловой случай или что-то еще. Альтернативные подходы для ее решения также приветствуются.
CinCout
1
@ CinCout-ReinstateMonica Пожалуйста, смотрите мой ответ для возможного случая пропущенного края (не уверен, если это имеет отношение к OP).
Стив Чамберс
4

Предполагая, что «что-нибудь» не содержит цифр, вы можете использовать это регулярное выражение:

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

Демо на regex101

Ник
источник
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 Someword 12 что-нибудь Someword 2323 Новое Someword

изменение:

43434 Someword 12 Someword 2323 Someword

Реза Дженаби
источник
2

Но иногда между словом и числом будет что-нибудь. Пожалуйста, посмотрите строку примера ниже.

Пример:

43434 Someword 12 что-нибудь Someword 2323 Новое Someword

попробуй это

(\ D +) (. *?) Someword

Разъяснения

\ d + - числа

. *? - что угодно после чисел, но минимальное вхождение.

someword - точное совпадение

демонстрация

Раджеш Г
источник
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

Используйте именованные совпадения (для получения данных используйте 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

Визуально вот что соответствует:

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

ΩmegaMan
источник