Правильный ответ будет использовать 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]+")?
-
,
между 0-9 и AF: не разделитель между двумя диапазонами. Он просто добавляет ,
в допустимый набор символов, что, вероятно, не ваша цель (вы будете принимать хэши, такие как 0123,456
) - Финальный
?
указывает, что вся группа является необязательной. Так что, если это не может быть сопоставлено, это все равно успех Как следствие, строки типа abcd
будут совпадать (и matches()
вернет 5 совпадений длины 0: перед a, между a и b, между b и c, et c ...)