Соответствует только первому вхождению в регулярном выражении C# - PullRequest
0 голосов
/ 02 марта 2020

Я хочу соответствовать только первому Hash="" в этом.

Hash="123"Hash="AEBB1247209BC9E10EA2054F1813DFD7BB9EEF23FEF7C867FCFCEC69CA0C2A6D"Hash="1"  

Я пытался с регулярным выражением (Hash="[0-9,A-F]+")?

Но это всегда соответствует всем 3 Hash="". Есть ли способ это исправить? Я использую библиотеку C# Regex.

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Просто используйте Match () , а не Matches () .

1 голос
/ 02 марта 2020

Правильный ответ будет использовать regex.match() вместо regex.matches().

Первый возвращает только первое совпадение, второй возвращает все совпадения.

Однако, есть это регулярное выражение, которое выполняет работу и возвращает только первое, независимо от того, что вы называете match () или match ():

(?<!Hash="[0-9A-F]+".*)Hash="[0-9A-F]+"

Примечание: это работает в C#, но не будет работать в большинстве других языков (например, Java)

(?<!Hash="[0-9A-F]+".*) - это отрицательный прогноз: не должно быть возможности сопоставить Hash="[0-9A-F]+".* в левой части текущего положение (часть уже прочитана). Другими словами, он соответствует только первому Ха sh.

Две вещи, касающиеся вашего текущего регулярного выражения: (Hash="[0-9,A-F]+")?

  1. , между 0-9 и AF: не разделитель между двумя диапазонами. Он просто добавляет , в допустимый набор символов, что, вероятно, не ваша цель (вы будете принимать хэши, такие как 0123,456)
  2. Финальный ? указывает, что вся группа является необязательной. Так что, если это не может быть сопоставлено, это все равно успех Как следствие, строки типа abcd будут совпадать (и matches() вернет 5 совпадений длины 0: перед a, между a и b, между b и c, et c ...)
0 голосов
/ 02 марта 2020

Вы можете использовать приведенное ниже регулярное выражение для достижения своей функциональности:

(Hash="([0-9,A-F]+)[^"]*).*"

Объяснение:

  • 1-я группа захвата (Hash="([0-9,A-F]+)[^"]*) Hash = "соответствует символам Hash = "буквально (с учетом регистра)

  • 2-я группа захвата ([0-9, AF] +):

  • Соответствует одному символу, присутствующему в списке ниже [0-9,A-F]+ + Квантификатор - сопоставляет от одного до неограниченного количества раз столько раз, сколько возможно, возвращая при необходимости (жадный)
  • 0-9 один символ в диапазоне от 0 (индекс 48) и 9 (индекс 57) (с учетом регистра)
  • , соответствует символу, буквально (с учетом регистра)
  • A-F один символ в диапазоне между A (индекс 65) и F (индекс 70) (с учетом регистра)

  • Соответствует одному символу, отсутствующему в списке ниже [^"]*

  • * Квантор - Соответствует от нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадный)
  • " соответствует символу "буквально (с учетом регистра)

  • .* соответствует любому символу (кроме ограничителей строки)

  • * Quantifier - Matches от нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадность)
  • " соответствует символу "буквально (с учетом регистра)

Рабочий пример: https://regex101.com/r/XTqhyU/2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...