регулярное выражение - запрещение последовательности символов - PullRequest
1 голос
/ 15 января 2012

У меня есть переменная в виде {varName} или {varName, "defaultValue"}, и я хочу регулярное выражение, которое будет ей соответствовать. varName является только буквенно-цифровым и "_" (\ w +), и значением по умолчанию может быть что угодно, кроме комбинации "}, которая обозначает конец переменной. Пробел не имеет значения между фигурными скобками, запятой, varName или defaultValue. До сих пор я придумал регулярное выражение

\{\s*(\w+)\s*(,\s*\"([^(\"\})]*)\"\s*)?\}

Проблема в том, что совпадение заканчивается первым «ИЛИ», а не комбинацией, то есть {привет, «мир»} действительно совпадает, но {привет, «wor» ld »} или {привет,« wor} ld » }

Есть идеи, как это решить? Если это помогает, я пишу код с использованием Java.

Ответы [ 2 ]

1 голос
/ 16 января 2012

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

\{\s*(\w+)\s*(,\s*\"((.*?)\s*\")?\})

выполнит трюк, остановившись на первой последовательности '"}'

В Java это будет (продолжая предыдущий пример ответа):

final Pattern p = Pattern.compile("\\{\\s*(\\w+)\\s*(,\\s*\"(.*?)\\s*\"\\s*)?\\}");
Matcher m1 = p.matcher("{hello, \"world\"}");
if (m1.matches()) {
    System.out.println("var1:" + m1.group(1));
    System.out.println("val1:" + m1.group(3));
}
Matcher m2 = p.matcher("{hello, \"wor\"rld\"}\"}");
if (m2.matches()) {
    System.out.println("var2:" + m2.group(1));
System.out.println("val2:" + m2.group(3));
}

/* Output
var1:hello
val1:world
var2:hello
val2:wor"rld"}
*/
1 голос
/ 15 января 2012
final Pattern p = Pattern.compile("\\{\\s*(\\w+)\\s*(,\\s*\"((?!\"\\}).*)\"\\s*)?\\}");
Matcher m1 = p.matcher("{hello, \"world\"}");
if (m1.matches()) {
    System.out.println("var1:" + m1.group(1));
    System.out.println("val1:" + m1.group(3));
}
Matcher m2 = p.matcher("{hello, \"wor}ld\"}");
if (m2.matches()) {
    System.out.println("var2:" + m2.group(1));
    System.out.println("val2:" + m2.group(3));
}
Matcher m3 = p.matcher("{hello, \"wor}\"ld\"}");
if (m3.matches()) {
    System.out.println("var3:" + m3.group(1));
    System.out.println("val3:" + m3.group(3));
}

/*output: 
var1:hello
val1:world
var2:hello
val2:wor}ld
var3:hello
val3:wor}"ld */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...