Выражение для проверки '_' - PullRequest
1 голос
/ 23 апреля 2011

Как проверить, находится ли '_' в строке или нет с помощью регулярных выражений?

Пример: _a, a_ab_a_b.

Ответы [ 3 ]

7 голосов
/ 23 апреля 2011

Используя Java, вы можете использовать string.contains:

boolean hasUnderscore = str.contains("_");
1 голос
/ 23 апреля 2011

Вы используете шаблон

'^(?=.*_.*)$', чтобы убедиться, что '_' находится в строке

или

'^(?!.*_.*)$' или '^(?=[^_]*)$', чтобы убедиться в этомне там

Но не имеет смысла использовать это в одиночку.Это должно быть частью большего шаблона.

.

РЕДАКТИРОВАТЬ

Я должен сделать более объяснительный ответ и ИСПРАВИТЬ ВЫШЕ УЗОРЫ.

.

Я написал вышеотвечайте быстро, не тестируя предложенные шаблоны.Моя идея заключалась в том, что нет оправдания использовать их «обнаженными», как они есть, потому что, как Коби «подчеркнул» это :), можно проверить наличие '_' без регулярных выражений, и поэтому предпочтительнее делать то, что он предлагал, когда это единственная цель.

Но я написал свой ответ, сначала чтобы дать подсказку спрашивающему, желающему узнать, и во-вторых, чтобы дать подсказкуэто позволит написать больший шаблон.

Моя идея действительно заключается в том, что один из этих трех элементарных шаблонов может быть связан с любым другим реальным шаблоном, который ищет некоторые конкретные строки.

.

Запись слишком быстроэтот ответ привел меня к ошибке в 3 паттернах.

Я впервые написал '^(?=.*_.*$)', например.Но я изменил его перед публикацией, полагая, что оставшаяся часть большего шаблона должна быть вставлена ​​между '^(?=.*_.*)' и '$'.Правильно, дополнение должно быть вставлено перед конечным символом '$', что означает «конец строки здесь».Но дело в том, что каждый из 3-х правильных шаблонов ДОЛЖЕН также не изменять символ '$' ВНУТРИ скобок.

.

"Обнаженные" неправильные шаблоны:

'^(?=.*_.*)$'
'^(?!.*_.*)$'
'^(?=[^_]*)$'

.

Правильные:

'^(?=.*_.*$)'
'^(?!.*_.*$)'
'^(?=[^_]*$)'

Затем вы добавляете к ним дополнительные элементарные шаблоны в соответствии с тем, что хотите поймать.

.

Например, если вы хотите поймать первое число в строке, в которой должны бытьне быть подчеркиванием, шаблон будет:

'^(?=[^_]*$).*?(\d+)'

и будет пойман номер '123' в строке 'kfgv 123 tg 4567 jkfv' по группе 1.

Но теперь, если вы хотите поймать последнее число (= чем ближе к концу строки), в котором не должно быть никаких подчеркиваний, шаблон должен быть:

'^(?=[^_]*$).*?(\d+)[^\d]*$'

В этом случае в шаблоне заполнения есть два символа '$', и важным моментом является то, что '$', присутствующий в '^(?=[^_]*$)', абсолютно необходим, поскольку без этого символа в этом месте, будет ложный результат:

'^(?=[^_]*).*?(\d+)[^\d]*$' соответствует строке 'kfg_v 123 тг4567 jkfv ' и группа 1 совпадает с ' 4567 ', хотя это не должно происходить из-за подчеркивания в анализируемой строке

Наоборот, '^(?=[^_]*$).*?(\d+)[^\d]*$' несовпадать с одной и той же строкой, и это то, на что нацелено.

0 голосов
/ 24 апреля 2011

Как упоминает Коби, String.contains () гораздо эффективнее.

Однако, если нужно проверить, есть ли шаблон где-либо в строке, следующий пример показывает, как это сделать:

Pattern p = Pattern.compile(myPattern);
Matcher m = p.matcher(stringToCheck);
if (m.find()) {
  System.out.println("String contains pattern");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...