Я хочу сопоставить и найти индекс слова, либо окруженный пробелом, либо специальными символами. Например:
To find: test
this is input test : True
this is#input_ : True
this isinput : False
thisisinputtest: False
this @test is right: True.
Как мне сопоставить это и найти индекс. Мое текущее регулярное выражение не выполняется: (?i)[^a-zA-Z0-9]test[^a-zA-Z0-9]
Я думаю, что вам нужно использовать образы в вашем случае:
(?<!\p{Alnum})test(?!\p{Alnum})
Отрицательный lookbehind (?<!\p{Alnum})
выйдет из строя, если есть алфавитно-цифровой символ, присутствующий слева от test
, а отрицательный lookahead (?!\p{Alnum})
выйдет из строя, если является буквенно-цифровым символом сразу после test
.
Смотрите скриншот тестирования:
String str = "this is#test_ :";
Pattern ptrn = Pattern.compile("(?<!\\p{Alnum})test(?!\\p{Alnum})");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
System.out.println(matcher.start());
}
Альтернативный способ: сопоставить и зафиксировать поисковое слово и распечатать начальную позицию первой группы захвата:
Pattern ptrn = Pattern.compile("\\P{Alnum}(test)\\P{Alnum}");
...
System.out.println(matcher.start(1));
См. Эту демонстрационную версию Java
Обратите внимание, что в этом сценарии \P{Alnum}
является шаблоном потребления, а в некоторых случаях края test
может не совпадать.
"(?<!\\p{Alpha})test(?!\\p{Alpha})"
Я просто пытаюсь понять ваш вопрос. Вы ищете test
который окружен специальным символом (включенным) или пробелом? Но вы говорите, что this is#input_: True
. Я не уверен, что я ошибаюсь, но как это верно в этом случае?
Во всяком случае, у меня есть регулярное выражение [\W\s_](input|test)[\W\s_]
которое соответствует всем вашим случаям, определенным как true.
Также я пользуюсь этим сайтом в любое время, когда я работаю с Regex, поскольку считаю его полезным.
Не уверен, что это ответ, который вы ищете, но дайте мне знать, если я ошибаюсь, и я попробую еще раз
_
это слово, а не специальный символ. Кроме того,this is#input_
не может бытьTrue
, где словоtest
там?#test_
отсутствует в ваших тестовых#test_
.