Регулярное выражение для соответствия слова в окружении не алфавитно-цифровых символов

2

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

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]

  • 0
    Это другой случай, потому что в моем случае #test_ должен возвращать индекс теста, а не #test.
  • 0
    _ это слово, а не специальный символ. Кроме того, this is#input_ не может быть True , где слово test там? #test_ отсутствует в ваших тестовых #test_ .
Показать ещё 7 комментариев
Теги:
string

2 ответа

3
Лучший ответ

Я думаю, что вам нужно использовать образы в вашем случае:

(?<!\p{Alnum})test(?!\p{Alnum})

Отрицательный lookbehind (?<!\p{Alnum}) выйдет из строя, если есть алфавитно-цифровой символ, присутствующий слева от test, а отрицательный lookahead (?!\p{Alnum}) выйдет из строя, если является буквенно-цифровым символом сразу после test.

Смотрите скриншот тестирования:

Изображение 174551

Java-демонстрация:

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 может не совпадать.

  • 0
    Хотя мне было не ясно в вопросе (извините за это!), Это именно то, что я хотел! Большое спасибо!
  • 0
    Для тех, кому нужны только буквенные символы, а не буквенно-цифровые, вы можете использовать "(?<!\\p{Alpha})test(?!\\p{Alpha})"
Показать ещё 2 комментария
0

Я просто пытаюсь понять ваш вопрос. Вы ищете test который окружен специальным символом (включенным) или пробелом? Но вы говорите, что this is#input_: True. Я не уверен, что я ошибаюсь, но как это верно в этом случае?

Во всяком случае, у меня есть регулярное выражение [\W\s_](input|test)[\W\s_] которое соответствует всем вашим случаям, определенным как true.

  • \W соответствует любым словам
  • \s соответствует любому пробелу
  • _ соответствует любому подчеркиванию - должен быть определен сам по себе, поскольку это слово
  • Из моей путаницы упомянутого теста я имею регулярное выражение для ввода и тестирования

Также я пользуюсь этим сайтом в любое время, когда я работаю с Regex, поскольку считаю его полезным.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню