Вопрос по java, regex, python – Различия в синтаксисе RegEx между Python и Java

6

У меня есть работающее регулярное выражение в Python, и я пытаюсь преобразовать в Java. Кажется, что в реализациях есть небольшая разница.

RegEx пытается соответствовать другой рег экс. RegEx в вопросе:

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

Одна из строк, с которой возникают проблемы:/\s+/;

Reg ex не должен совпадать с окончанием;, В Python RegEx работает правильно (и не соответствует окончанию;, но в Java это включает;.

Вопросы):

  1. What can I do to get this RegEx working in Java?
  2. Based on what I read here there should be no difference for this RegEx. Is there somewhere a list of differences between the RegEx implementations in Python vs Java?
@happydave - уточнил вопрос выше. Vineet
Не могли бы вы опубликовать код Python и Java для вашего матча? Не могли бы вы уточнить, что вы имеете в виду под "quat; Это происходит в Python, но не в Java"? Какой язык соответствует строке, а какой нет? happydave
Это регулярное выражение выглядит так, как будто оно должно соответствовать литералу регулярного выражения JavaScript, верно? И это работает на Python, но вы хотите запустить его на Java? Alan Moore
@AlanMoore - да. Он пытается соответствовать регулярному выражению JavaScript. Он работает в Python, он не работает в Java. Vineet

Ваш Ответ

2   ответа
11

как Python, для небольшого набора случаев. В данном конкретном случае вложенные[были проблемы. В Python вам не нужно избегать вложенных[ но вам нужно сделать это в Java.

Оригинальный RegEx (для Python):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

Фиксированный RegEx (для Java и Python):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B)
5

что в Java вам нужно экранировать много символов.

Более того, вы, вероятно, столкнулись с несоответствием между подходящими методами, а не с разницей в фактической нотации регулярного выражения:

Учитывая Java

String regex, input; // initialized to something
Matcher matcher = Pattern.compile( regex ).matcher( input );
Java's matcher.matches() (also Pattern.matches( regex, input )) matches the entire string. It has no direct equivalent in Python. The same result can be achieved by using re.match( regex, input ) with a regex that ends with $. Java's matcher.find() and Python's re.search( regex, input ) match any part of the string. Java's matcher.lookingAt() and Python's re.match( regex, input ) match the beginning of the string.

Для получения более подробной информации также прочитайте документацию по JavaMatcher и сравнить сPython документация.

Поскольку вы сказали, что это не проблема, я решил сделать тест:http://ideone.com/6w61T Похоже, что Java делает именно то, что вам нужно (группа 0, полное совпадение, не содержит;). Ваша проблема в другом месте.

@ Vineet отметил и отредактировал. Я также проверил это, и ваша проблема, кажется, в другом месте.
re.fullmatch из 3.4 может сделать то же самое, что иmatcher.matches
Да, персонажам удается сбежать. Отличное замечание относительно различий в методах - здесь, похоже, нет проблемы (я это проверил - похоже, что-то не так с reg ex). Копаться в этом немного больше в (docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html) похоже тамis эквивалент для Pythonre.match в Java - кажется,matcher.lookingAt. Vineet

Похожие вопросы