Вы используете шаблон
'^(?=.*_.*)$'
, чтобы убедиться, что '_' находится в строке
или
'^(?!.*_.*)$'
или '^(?=[^_]*)$'
, чтобы убедиться в этомне там
Но не имеет смысла использовать это в одиночку.Это должно быть частью большего шаблона.
.
РЕДАКТИРОВАТЬ
Я должен сделать более объяснительный ответ и ИСПРАВИТЬ ВЫШЕ УЗОРЫ.
.
Я написал вышеотвечайте быстро, не тестируя предложенные шаблоны.Моя идея заключалась в том, что нет оправдания использовать их «обнаженными», как они есть, потому что, как Коби «подчеркнул» это :), можно проверить наличие '_' без регулярных выражений, и поэтому предпочтительнее делать то, что он предлагал, когда это единственная цель.
Но я написал свой ответ, сначала чтобы дать подсказку спрашивающему, желающему узнать, и во-вторых, чтобы дать подсказкуэто позволит написать больший шаблон.
Моя идея действительно заключается в том, что один из этих трех элементарных шаблонов может быть связан с любым другим реальным шаблоном, который ищет некоторые конкретные строки.
.
Запись слишком быстроэтот ответ привел меня к ошибке в 3 паттернах.
Я впервые написал '^(?=.*_.*$)'
, например.Но я изменил его перед публикацией, полагая, что оставшаяся часть большего шаблона должна быть вставлена между '^(?=.*_.*)'
и '$'
.Правильно, дополнение должно быть вставлено перед конечным символом '$'
, что означает «конец строки здесь».Но дело в том, что каждый из 3-х правильных шаблонов ДОЛЖЕН также не изменять символ '$'
ВНУТРИ скобок.
.
"Обнаженные" неправильные шаблоны:
'^(?=.*_.*)$'
'^(?!.*_.*)$'
'^(?=[^_]*)$'
.
Правильные:
'^(?=.*_.*$)'
'^(?!.*_.*$)'
'^(?=[^_]*$)'
Затем вы добавляете к ним дополнительные элементарные шаблоны в соответствии с тем, что хотите поймать.
.
Например, если вы хотите поймать первое число в строке, в которой должны бытьне быть подчеркиванием, шаблон будет:
'^(?=[^_]*$).*?(\d+)'
и будет пойман номер '123' в строке 'kfgv 123 tg 4567 jkfv' по группе 1.
Но теперь, если вы хотите поймать последнее число (= чем ближе к концу строки), в котором не должно быть никаких подчеркиваний, шаблон должен быть:
'^(?=[^_]*$).*?(\d+)[^\d]*$'
В этом случае в шаблоне заполнения есть два символа '$'
, и важным моментом является то, что '$'
, присутствующий в '^(?=[^_]*$)'
, абсолютно необходим, поскольку без этого символа в этом месте, будет ложный результат:
'^(?=[^_]*).*?(\d+)[^\d]*$'
соответствует строке 'kfg_v 123 тг4567 jkfv ' и группа 1 совпадает с ' 4567 ', хотя это не должно происходить из-за подчеркивания в анализируемой строке
Наоборот, '^(?=[^_]*$).*?(\d+)[^\d]*$'
несовпадать с одной и той же строкой, и это то, на что нацелено.