Требуется уточнение (помощь) с регулярным выражением - PullRequest
0 голосов
/ 29 марта 2012

Хорошо, у меня есть фраза, разделенная пробелами.Каждый элемент может быть только целым или действительным числом, за исключением двух последних элементов, которые могут быть строкой null.Мое регулярное выражение

([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null)

Я не понимаю, почему в фразе

123 15 3 null null

последний ноль не захватывается.Кто-то упомянул использование «/» и сказал мне, что они похожи на кавычки для регулярных выражений, но мне показалось, что добавление, которое просто должно с помощью регулярного выражения искать эту строку.Я пишу свое регулярное выражение в этой форме, потому что я внедряю его в Java, и мне нужно соответствующим образом разделить группы или элементы.

РЕДАКТИРОВАТЬ: Спасибо всем за отличные ответы.Очевидно, мне нужно больше практики, и, возможно, немного спать!Мое регулярное выражение теперь выглядит намного чище.

Пересмотренное выражение

(\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+|null) (\d+\.\d+|\d+|null)

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Это связано с тем, как вы определяете свои группы или с помощью модификатора *:

 ([0-9]*\.[0-9]*|[0-9]*|null)

С помощью приведенного выше утверждения можно ничего не сравнить с [0-9] *. И он сначала будет соответствовать этому, если сможет.

Когда у вас есть 2 подряд:

([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null)

Теперь он вынужден совпадать со значением «ноль» в первой группе, но не может сравниться с ничем во второй.

Если вы измените эти группы захвата на:

([0-9]*\.[0-9]*|[0-9]+|null)

Они больше не смогут соответствовать «ничему» и будут выстраиваться так, как вы хотите.

Вы также можете перевернуть его и заставить его совпадать со значением «ноль», прежде чем ничего:

([0-9]*\.[0-9]*|null|[0-9]*)
1 голос
/ 29 марта 2012

Десятичные группы для действительных чисел должны быть необязательными с помощью ?, а поскольку целое число не является обязательным, используйте + вместо *.

(\d+(?:\.\d+)?) (\d+(?:\.\d+)?) ((\d+(?:\.\d+)?)|null) ((\d+(?:\.\d+)?)|null)
1 голос
/ 29 марта 2012

Если вы всегда ожидаете следующий формат:

Number Number Number Number|null Number|null

Следующее регулярное выражение будет соответствовать ему:

([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+|null) ([0-9]+\.[0-9]+|[0-9]+|null)

* означает 0 или более, а + означает 1 или более.

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