2013-07-12 2 views
3

Я пишу регулярное выражение в java, но я получаю сообщение об ошибке при запуске программы.java.util.regex.PatternSyntaxException: Unclosed character class near index

private final static Pattern QUOTE_VALUE = Pattern.compile("[_]?([a-zA-Z0-9_]+)=(\"[^]*\"),"); 
// Then later on down the road...... 
Macher m = QUOTE_VALUE.matcher(myString); 
while (m.find()){ 
    System.out.println("Found " + m.group(1) + " " + m.group(2)); 
} 

Я хочу, чтобы мое регулярное выражение соответствовало этим образцам.

_MyKey="ID IN [ "ABC" ]", // Note - it has a comma after the ] 
_MyKey="ID IN [ ""XYZ"" ]", // Note - it has a comma after the ] 

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

Caused by: java.util.regex.PatternSyntaxException: Unclosed character class near index 28 
[_]?([a-zA-Z0-9_]+)=("[^]*"), 

Другой вопрос, как я форматировать регулярное выражение, так что я могу также сравнить его с этой строки?

MyKey="ID IN [ "ABC" ]", // without the _ 
_MyKey="ID IN [ "ABC" ]", // with the _ 

Спасибо.

[EDIT]

Можете ли вы помочь мне с этой частью вопроса?

Другой вопрос: как мне форматировать регулярное выражение, чтобы я мог также сопоставить его с этой строкой?

MyKey = "идентификатор [ "ABC"]", // без _ _MyKey = "ID в [ "ABC"]", // с _

+3

Мое предположение, что у вас есть незакрытый класс символов – keyser

+0

Взгляните на раздел под названием «Метасимволы внутри классов символов» на [этой странице, объясняющей классы символов] (http://www.regular-expressions.info/charclass. html), где они адресуют '[^] x]' в качестве примера, который может хорошо объяснить вашу ошибку. – femtoRgon

ответ

4

Эта часть:

[^] 

потребности в либо

[\\^]* 

, если вы ищете последовательность из нуля или шляп символов. (Примечание, что первая обратная косая черта заключается в том, чтобы рассказать синтаксический анализатор Java, что вторая обратная косая черта должна оставаться в строке. Конечным результатом является то, что парсер регулярных выражений видит только одну обратную косую черту и использует его, чтобы сказать, что символ шляпы должен быть часть символьного класса, идентифицированный в квадратных скобках)

или вы что-то вы не хотите, как недостающие:.

[^b]* 

соответствовать нулю или более не б символов

Учитывая что вы хотите совместить, попробуйте [^"]* или, может быть, просто .*

Если вам не нужно, чтобы соответствовать по линии окончаний, используйте .* и поставить ?s в передней части регулярных выражений, чтобы заставить Java регулярное выражение Искателя в режим, который позволяет дот, чтобы соответствовать всем символам, включая символ новой строки.

Благодаря @TimPietzcker для примечания к javascript. Это говорит о том, что онлайн-инструмент не был обработчиком регулярных выражений Java, но может быть javascript regex checker.

+0

'[^]' является общим сокращением для 'любого символа, включая новые строки 'в JavaScript (потому что там нет опции' Pattern.DOTALL'). Таким образом, это, вероятно, простой '.' вместе с параметром' Pattern.DOTALL', который ему нужен. –

+0

Можете ли вы помочь мне с этой частью вопроса? – Ted

+0

Я бы подумал, что вам нужно только _ _?, Чтобы разрешить 0 или 1 подчеркивание. Я не думаю, что вам нужны скобки, поскольку вы кладете '[_]?', Но я бы предположил, что это тоже должно работать. Я попробовал это здесь http://www.regexplanet.com/advanced/java/index.html, и он работает для обоих. –

Смежные вопросы