#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");
}