嵌入式参数的Java表达式
我正在为我的模式定义java表达式,但它不起作用 以下是我要为其定义模式的文本:嵌入式参数的Java表达式,java,regex,Java,Regex,我正在为我的模式定义java表达式,但它不起作用 以下是我要为其定义模式的文本: "sometext {10} some text {25} sometext". 命名参数是{10}、{25}、 我使用了如下模式:“({\d+})*”,但它不起作用,我收到了异常: Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 0 ({\d+})* 以下是我的代码: public static
"sometext {10} some text {25} sometext".
命名参数是{10}、{25}、
我使用了如下模式:“({\d+})*”,但它不起作用,我收到了异常:
Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 0
({\d+})*
以下是我的代码:
public static final Pattern pattern = Pattern.compile("({\\d+})*");
public static void main(String[] args) {
String s = "{10}ABC{2}";
Matcher matcher = pattern .matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
有人能解释一下我的错误吗?谢谢。
{
是正则表达式中的一个特殊字符,只需对其进行双转义即可。\{
。与}
相同
还要考虑到,如果使用
*
,它也将匹配空字符串。{
是正则表达式中的一个特殊字符,只需对其进行双转义即可。\{
。与}
相同
还要考虑到,如果使用
*
,它也会匹配空字符串。您的模式存在一些问题
- 首先,您不需要外括号,因为您没有从主组定义组save
- 其次,您必须避开花括号(
\\{
),否则它们将被解释为量词
- 第三,您不需要最后一个量词(
*
),因为您在同一输入字符串中迭代匹配项
因此,您的模式
看起来像“\\{\\d+\}”
有关JavaPattern
s的更多信息
编辑--示例
String input = "sometext {10} some text {25} sometext";
Pattern p = Pattern.compile("\\{\\d+\\}");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group());
}
输出:
{10}
{25}
您的模式存在一些问题
- 首先,您不需要外括号,因为您没有从主组定义组save
- 其次,您必须避开花括号(
\\{
),否则它们将被解释为量词
- 第三,您不需要最后一个量词(
*
),因为您在同一输入字符串中迭代匹配项
因此,您的模式
看起来像“\\{\\d+\}”
有关JavaPattern
s的更多信息
编辑--示例
String input = "sometext {10} some text {25} sometext";
Pattern p = Pattern.compile("\\{\\d+\\}");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group());
}
输出:
{10}
{25}
我使用了“\{\\d+\\}”,但它不起作用。你能给我看一下模式吗?@Luu请看我的编辑。如果你去掉括号,你不能引用组1,只需通过Matcher.group()
方法引用组0。它现在起作用了。如果我使用m.group(1),它会引发异常,但是如果group(),它会起作用。谢谢。我接受你的解决方案。我使用了“\\{\\d+\}但它不起作用。你能给我看一下模式吗?@Luu请看我的编辑。如果删除括号,你不能引用组1,只需通过Matcher.group()
方法引用组0。它现在起作用了。如果我使用m.group(1),它会抛出异常,但如果group(),有效。谢谢。我接受你的解决方案。结尾的花括号不需要转义。@CasimiritHippolyte可能不需要,但至少对我来说这会让人困惑。结尾的花括号不需要转义。@CasimiritHippolyte可能不需要,但至少对我来说会让人困惑。