字符串中的多个正则表达式匹配
multiple regex matches in a string
我有以下文字:
bla [string1] bli [string2]
我喜欢在 java 的循环中用正则表达式匹配 string1 和 string2。
怎么办?
到目前为止,我的代码只匹配第一个字符串 1,但不匹配字符串 2。
String sRegex="(?<=\[).*?(?=\])";
Pattern p = Pattern.compile(sRegex); // create the pattern only once,
Matcher m = p.matcher(sFormula);
if (m.find())
{
String sString1 = m.group(0);
String sString2 = m.group(1); // << no match
}
您的正则表达式未使用任何捕获的组因此此调用抛出异常:
m.group(1);
您可以只使用:
String sRegex="(?<=\[)[^]]*(?=\])";
Pattern p = Pattern.compile(sRegex); // create the pattern only once,
Matcher m = p.matcher(sFormula);
while (m.find()) {
System.out.println( m.group() );
}
另外 if
应替换为 while
以匹配多次到 return 所有匹配。
你的方法很混乱。要么编写你的正则表达式,使其匹配一个模式中的两个 [....]
序列,要么多次调用 find
。您当前的尝试有一个 "finds" 只有一个 [...]
序列的正则表达式。
尝试这样的事情:
Pattern p = Pattern.compile("\[([^\]]+)]");
Matcher m = p.matcher(formula);
if (m.find()) {
String string1 = m.group(0);
if (m.find(m.end()) {
String string2 = m.group(0);
}
}
或者对提取的字符串使用循环和 String
数组进行概括。
(在这种情况下你不需要任何花哨的后视模式。丑陋的"hungarian notation"在Java中皱眉,所以改掉使用它的习惯。)
我有以下文字:
bla [string1] bli [string2]
我喜欢在 java 的循环中用正则表达式匹配 string1 和 string2。
怎么办?
到目前为止,我的代码只匹配第一个字符串 1,但不匹配字符串 2。
String sRegex="(?<=\[).*?(?=\])";
Pattern p = Pattern.compile(sRegex); // create the pattern only once,
Matcher m = p.matcher(sFormula);
if (m.find())
{
String sString1 = m.group(0);
String sString2 = m.group(1); // << no match
}
您的正则表达式未使用任何捕获的组因此此调用抛出异常:
m.group(1);
您可以只使用:
String sRegex="(?<=\[)[^]]*(?=\])";
Pattern p = Pattern.compile(sRegex); // create the pattern only once,
Matcher m = p.matcher(sFormula);
while (m.find()) {
System.out.println( m.group() );
}
另外 if
应替换为 while
以匹配多次到 return 所有匹配。
你的方法很混乱。要么编写你的正则表达式,使其匹配一个模式中的两个 [....]
序列,要么多次调用 find
。您当前的尝试有一个 "finds" 只有一个 [...]
序列的正则表达式。
尝试这样的事情:
Pattern p = Pattern.compile("\[([^\]]+)]");
Matcher m = p.matcher(formula);
if (m.find()) {
String string1 = m.group(0);
if (m.find(m.end()) {
String string2 = m.group(0);
}
}
或者对提取的字符串使用循环和 String
数组进行概括。
(在这种情况下你不需要任何花哨的后视模式。丑陋的"hungarian notation"在Java中皱眉,所以改掉使用它的习惯。)