Регулярное выражение для проверки ‘_’

#java #regex

#java #регулярное выражение

Вопрос:

Как мне проверить, находится ли ‘_’ в строке или нет, используя регулярные выражения?

Пример: _a,a_ab_a_b.

Комментарии:

1. Какой язык вы используете? Зачем вам нужно регулярное выражение? Просто используйте строковую функцию

2. @JohnP: Я использую Java.

Ответ №1:

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

 boolean hasUnderscore = str.contains("_");
  

Ответ №2:

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

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

или

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

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

.

Редактировать

Я должен дать более пояснительный ответ и ИСПРАВИТЬ ВЫШЕПРИВЕДЕННЫЕ ШАБЛОНЫ.

.

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

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

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

.

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

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

.

«Обнаженные» неправильные шаблоны являются:

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

.

Правильными являются:

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

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

.

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

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

и число ‘123’ в строке ‘kfgv 123 tg 4567 jkfv’ будет перехвачено группой 1.

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

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

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

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

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

Комментарии:

1. Все эти шаблоны по сути являются ^(?=)$ — это пустая строка с обходом, которая не имеет особого смысла (как вы сказали, справедливости ради). Простой шаблон — это _ , или ^[^_]*_.*$ для сопоставления всей строки.

2. @Kobi Я согласен с тобой. Я завершил свой ответ, чтобы прояснить свое мнение.

3. Любой ответ, требующий шаблона длиной более одного символа и содержащий этот символ _ , довольно нелеп.

4. @tchrist Я не понимаю, что ты имеешь в виду. Вы намекаете на тот факт, что '^(?=[^_]*$).*?(d )[^d]*$' может быть заменено на '^[^_]*?(d )[^d_]*$' ? ЭТО верно, но я не думал давать ответ, являющийся наилучшим из возможных в реальном приложении; Я скорее думал дать ответ в контексте вопроса. После этого количество контекстов реальных приложений безгранично. Следует также отметить, что замена вышеуказанных элементарных шаблонов более простыми возможна скорее для, "_ is not in" чем для "_ is in" регулярного выражения.

5. @eyquem: Я думаю, дело в том, что для ответа на конкретный вопрос пользователя требуется не что иное, как регулярное выражение длиной в один символ, которое соответствует a: '_' т.е. Pattern re = Pattern.compile("_");

Ответ №3:

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

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

 Pattern p = Pattern.compile(myPattern);
Matcher m = p.matcher(stringToCheck);
if (m.find()) {
  System.out.println("String contains pattern");
}