正则表达式 - 匹配不包含字符串的模式
Regex - Matching a pattern not containing a string
我看过其他类似的问题,但都是关于匹配的开头和结尾,这不是我要找的。
我想用语法匹配参数:
{{param-name}}
或 {{param-name=default value}}
到目前为止,我有以下正则表达式:
(\{\{[a-zA-Z0-9_-]*(?:=.*)?\}\})
但问题是,如果有多个参数,它只会创建一个匹配项:从第一个开始到最后一个结束。例如:
bla bla {{foo=blabla}} bla bla {{bar=hehe}} bla bla
将匹配:{{foo}} bla bla {{bar=hehe}}
而我想要 {{foo}}
和 {{bar=hehe}}
所以我需要检查,在 =
字符之后,在 }}
终止参数之前没有 }}
字符串。
我不知道该怎么做。你能帮助我吗 ?
谢谢:)
PS :如果重要的话,我会在 Java 中使用它。
将=
之后的.*
设置为非贪婪
(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})
Java 正则表达式是,
"(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})"
或
(\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\})
在此,我将可选的非捕获组中的.*?
修改为(?:(?!}}).)*
。
(?!..)
称为负先行断言。这不会匹配任何字符,但会断言匹配是否会出现在特定位置。这里 (?!}}).
检查我们要匹配的字符不是 }}
的条件。那就是后面的字符不会是 }}
中的第一个右大括号
如果是,则只匹配对应的字符。
所以这个 (?:(?!}}).)*
匹配任何字符但不匹配 }}
零次或多次。 *
旁边的 ?
使 *
进行非贪婪匹配。请注意,这将匹配单个右大括号。
代码:
String s = "bla bla {{foo}} bla bla {{bar=hehe}} bla bla";
Matcher m = Pattern.compile("\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\}").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
输出:
{{foo}}
{{bar=hehe}}
在 Java 中,通常所有正则表达式都可以正常工作,但语法会发生变化。
使用双斜杠('\')而不是单斜杠。
试试这个:
(\{\{[A-Za-z0-9_-]*(?:=.*)?\}\})
我看过其他类似的问题,但都是关于匹配的开头和结尾,这不是我要找的。
我想用语法匹配参数:
{{param-name}}
或 {{param-name=default value}}
到目前为止,我有以下正则表达式:
(\{\{[a-zA-Z0-9_-]*(?:=.*)?\}\})
但问题是,如果有多个参数,它只会创建一个匹配项:从第一个开始到最后一个结束。例如:
bla bla {{foo=blabla}} bla bla {{bar=hehe}} bla bla
将匹配:{{foo}} bla bla {{bar=hehe}}
而我想要 {{foo}}
和 {{bar=hehe}}
所以我需要检查,在 =
字符之后,在 }}
终止参数之前没有 }}
字符串。
我不知道该怎么做。你能帮助我吗 ? 谢谢:)
PS :如果重要的话,我会在 Java 中使用它。
将=
之后的.*
设置为非贪婪
(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})
Java 正则表达式是,
"(\{\{[a-zA-Z0-9_-]*(?:=.*?)?\}\})"
或
(\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\})
在此,我将可选的非捕获组中的.*?
修改为(?:(?!}}).)*
。
(?!..)
称为负先行断言。这不会匹配任何字符,但会断言匹配是否会出现在特定位置。这里(?!}}).
检查我们要匹配的字符不是}}
的条件。那就是后面的字符不会是}}
中的第一个右大括号
如果是,则只匹配对应的字符。
所以这个
(?:(?!}}).)*
匹配任何字符但不匹配}}
零次或多次。*
旁边的?
使*
进行非贪婪匹配。请注意,这将匹配单个右大括号。
代码:
String s = "bla bla {{foo}} bla bla {{bar=hehe}} bla bla";
Matcher m = Pattern.compile("\{\{[a-zA-Z0-9_-]*(?:=(?:(?!}}).)*)?\}\}").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
输出:
{{foo}}
{{bar=hehe}}
在 Java 中,通常所有正则表达式都可以正常工作,但语法会发生变化。 使用双斜杠('\')而不是单斜杠。
试试这个:
(\{\{[A-Za-z0-9_-]*(?:=.*)?\}\})