регулярное выражение помощи в Java - PullRequest
2 голосов
/ 13 февраля 2012

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

@[xyz="1","2"'"4"] ------- valid
@[xyz] ------------- valid
@[xyz="a5","4r"'"8dsa"] -- valid

@[xyz="asd"] -- invalid
@[xyz"asd"] --- invalid
@[xyz="8s"'"4"] - invalid

Допустимый шаблон должен быть:

  • @[xyzзатем =, затем несколько символов, затем ,, затем несколько символов, затем ', затем несколько символов и, наконец, ].Это означает, что если после xyz есть символы, то они должны быть в формате ="XXX","XXX"'"XXX".
  • или только @[xyz].Никаких символов после xyz.

Я попробовал следующее регулярное выражение, но оно не сработало:

String regex = "@[xyz=\"[a-zA-z][0-9]\",\"[a-zA-z][0-9]\"'\"[a-zA-z][0-9]\"]";

Здесь приведены цитаты (частично после xyz)Необязательный, и количество символов между кавычками также не является фиксированным, а также может быть несколько символов до и после этого шаблона, например asdadad @[xyz] adadad.

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

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

String regex = "@\\[xyz=\"[a-zA-z][0-9]\",\"[a-zA-z][0-9]\"'\"[a-zA-z][0-9]\"\\]";

Следующая проблемас помощью «[a-zA-z] [0-9]» вы определяете «первая буква, вторая цифра», вам нужно присоединиться к этим классам и добавить квантификатор:

String regex = "@\\[xyz=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\"\\]";

Посмотреть здесь на Regexr

2 голосов
/ 13 февраля 2012

Вы можете использовать регулярное выражение:

@\[xyz(?:="[a-zA-z0-9]+","[a-zA-z0-9]+"'"[a-zA-z0-9]+")?\]

См. Его

В виде строки Java это будет:

String regex = "@\\[xyz=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\"\\]";

Что не так с вашим регулярным выражением?

  • [...] определяет класс символов.Если вы хотите сопоставить литералы [ и ], вам нужно экранировать их, указав перед \.

  • [a-zA-z][0-9] совпадение с одной буквой и одной цифрой,Но вы хотите один или несколько буквенно-цифровых символов.Так что вам нужно [a-zA-Z0-9]+

2 голосов
/ 13 февраля 2012

Используйте это:

String regex = "@\\[xyz(=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\")?\\]";

Когда вы пишете [a-zA-z][0-9], он ожидает буквенный символ и цифру после него. Кроме того, вы должны избегать первых и последних квадратных скобок, потому что квадратные скобки имеют особое значение в регулярных выражениях.
Пояснение:
[a-zA-z0-9]+ означает буквенно-цифровой символ (но не подчеркивание) один или несколько раз.
(=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\")? означает, что выражение в скобках может быть одноразовым или не указываться вовсе.

0 голосов
/ 13 февраля 2012

также может быть несколько символов до и после этого шаблона, например asdadad @[xyz] adadad.

Регулярное выражение должно быть:

String regex = "(.)*@\\[xyz(=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\")?\\](.)*";

Первый и последний (.)* разрешит любую строку перед шаблоном, как вы упомянули при редактировании.Как сказал @ ademiban , этот (=\"[a-zA-z0-9]+\",\"[a-zA-z0-9]+\"'\"[a-zA-z0-9]+\")? придет один раз или не наступит вовсе.Другие ошибки также очень хорошо объясняются другими +1 ко всем другим.

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