Чтобы проверить, существует ли шаблон в строке - PullRequest
4 голосов
/ 29 февраля 2020

Я попытался найти, но не смог найти ничего, что имело бы для меня смысл! Я noob в regex:)

Пытаясь увидеть, существует ли конкретное слово "some_text" в другой строке.

String s = "This is a test() function"
String s2 = "This is a test    () function"

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

[^\w]test[ ]*[(]

Но не удалось получить положительное совпадение в Java, используя

System.out.println(s.matches("[^\\w]test[ ]*[(]");

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

Требуется, чтобы слово начиналось с пробела или являлось первым словом строки и содержало открытую скобку "(" после этого конкретного слова, так что все эти "test (), test () или test () "должен получить положительное совпадение.

Использование Java 1.8

Cheers, Faisal.

Ответы [ 5 ]

5 голосов
/ 29 февраля 2020

Вы упускаете из виду, что Java matches() ставит для вас ^ в начале и $ в конце регулярного выражения. Таким образом, ваше выражение на самом деле выглядит как:

^[^\w]test[ ]*[(]$

, которое никогда не будет соответствовать вашему вводу.

Исходя из описания вашего требования, я предлагаю изменить ваше выражение регулярного выражения до чего-то вроде этого (предполагая, что под «определенным словом» вы подразумевали test):

(?:.*)(?<=\s)(test(?:\s+)?\()(?:.*)

Смотрите здесь регулярное выражение.

Объяснение:

^                 Start of line - added by matches()
(?:.*)            Non-capturing group - match anything before the word, but dont capture into a group
(?<=\s)           Positive lookbehind - match if word preceded by space, but dont match the space
(                 Capturing group $1
  test(?:\s+)?    Match word test and any following spaces, if they exist
  \(              Match opening bracket
)                 
(?:.*)            Non-capturing group - match rest of string, but dont capture in group
$                 End of line - added by matches()

Пример кода:

public class Main {
    public static void main(String[] args) {
        String s = "This is a test() function";
        String s2 = "This is a test    () function";
        System.out.println(s.matches("(?:.*)((?<=\\s))(test(?:\\s+)?\\()(?:.*)")); 
        //true
    }
}
2 голосов
/ 29 февраля 2020

Я считаю, что этого должно быть достаточно:

s.find("\\btest\\s*\\(")
2 голосов
/ 29 февраля 2020

Попробуйте это "\ btest \ b (? = * ()".

И не используйте "совпадения", используйте "поиск". Совпадения, пытающиеся сопоставить всю строку

https://regex101.com/r/xaPCyp/1

2 голосов
/ 29 февраля 2020

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

Если вы просто заинтересованы в , если , ваше искомое значение существует в строке, я нашел следующее полезное:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Main {
  public static void main(String[] args) {
    String s = "This is a test    () function";
    Pattern p = Pattern.compile("\\btest *\\(");
    Matcher m = p.matcher(s);
    if (m.find())
      System.out.println("Found a match");
    else
      System.out.println("Did not find a match");
  }
}

Я пошел по следующему шаблону: \\btest *\\(

  • \\b - сопоставить границу слова (также поймает, если первое слово).
  • test - Буквально соответствует вашему значению поиска.
  • * - Ноль или более буквальных пробелов.
  • \\( - Экранированный открытый парантез для буквального совпадения.

Regular expression visualization

Демо Debuggex

1 голос
/ 01 марта 2020

Метод .matches будет соответствовать всей строке, где ваш шаблон получит только частичное совпадение.

В шаблоне, который вы пробовали, класс отрицательных символов [^\\w] также может соответствовать больше, чем пробел Граница, поскольку она соответствует любому символу, кроме символа слова. Например, он также может совпадать с ( или символом новой строки.

В соответствии с комментариями test() function также должен совпадать, при использовании [^\\w] или (?<=\s) ожидается, что символ будет слева.


Вместо этого вы можете использовать (?<!\\S), чтобы установить границу пропуска слева.

.*(?<!\S)test\h*\(.*

Объяснение

  • .* Совпадение 0+ раз с любым символом, кроме новой строки
  • (?<!\S) Утверждение границы пробела слева
  • test\h* Совпадение test и 0+ горизонтальных пробелов
  • \( Соответствует ( char
  • .* Соответствует 0+ раз любому символу, кроме новой строки

Regex demo | Java демо

In Java

System.out.println(s.matches(".*(?<!\\S)test\\h*\\(.*"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...