java.util.regex.Pattern не согласен с онлайн-отладчиком регулярных выражений - PullRequest
0 голосов
/ 23 декабря 2018

Я работаю с некоторым регулярным выражением для программы, я хочу, чтобы программа обнаружила определенный exe-файл, называемый gruell [что-то] .exe

Таким образом, я получил следующее регулярное выражение:

gruell.*\.exe[^\.]

После тестирования на обоих этих сайтах мои тесты были обнаружены правильно

Мой набор тестов: (и что должно завершиться неудачей и пройти)

  • gruell-Core.exe [PASS]
  • Gruell.exe [PASS]
  • gruell_x64.exe [PASS]
  • Gruell_x64-core.exe [PASS]
  • grull.exe [FAIL]
  • gruell _____. Exe [PASS]
  • gruell_installer.msi [FAIL]
  • gruell.html [FAIL]
  • .gruell.exe.398sn [FAIL]
  • gru-ell.exe [FAIL]

Когда я запускаю его на своем компьютере с помощью java.util.regex.Pattern, он ничего не найдет, хотя папка, которую я просил сканировать, содержит оба:

  • gruell.exe
  • .gruell.exe.398sn

Интересная часть - это когдаЯ удаляю [^.], Он обнаружит, но обнаруживает .gruell.exe.398sn, а это то, чего я не хочу.

Код, о котором идет речь:

File f = new File("G:\\dev\\gruell");
recursive_scan(f);

Функция:

for (file : location.listFiles())
{
    if (file.isDirectory)
    {
         recursive_scan(file)
    }
    else
    {
         Pattern pattern = Pattern.compile("gruell.*\\.exe[^\\.]", Pattern.CASE_INSENSITIVE);
         if (pattern.matcher(file.name).find())
         {
              System.out.println("FOUND: " + file.name);   
         }
     }
 }

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

После тестирования как на [regex101, так и на RegExr] мои тестовые случаи обнаруживаются правильно

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

Что приводит меня к проблеме с вашим шаблоном.Как вы уже заметили,

Теперь интересная часть, когда я удаляю [^.], Он обнаружит,

Это потому, что это подвыражение соответствует символу (отличается от .).Таким образом, ваш общий шаблон действительно не соответствует "gruell-Core.exe", поскольку после .exe нет символов.Вместо этого попробуйте сопоставить "gruell-Core.exee".

Если вы хотите, чтобы ваши совпадения заканчивались на .exe, вместо этого закрепите свой шаблон: gruell.*\.exe$

0 голосов
/ 23 декабря 2018

Хорошо, благодаря сайту, предоставленному Джоном Боллингером https://www.regexplanet.com/advanced/java/index.html Мне удалось обнаружить 2 вещи, которые здесь были не правы.

Прежде всего мне пришлось использовать:

 pattern.matcher(file.name).matches()

Вместо того, что у меня было:

 pattern.matcher(file.name).find()

И, во-вторых, мне пришлось удалить [^.] С конца строки.

От:

"gruell.*\\.exe[^.]"

Кому:

"gruell.*\\.exe"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...