在 java 正则表达式中捕获同一组的多个实例
Capturing multiple instances of the same group in java regex
我正在尝试使用正则表达式从一串 Pascal 代码中提取参数名称,这是我尝试使用的最复杂的方法。请注意,永远不会有白色 space,括号将始终存在。
(rate:real;interest,principal:real)
我目前得到的回复如下:
[(](?:([\w]*)(?:[:][\w])?[;|,]?)*[)]
我希望我可以在 re 传递参数时访问每个捕获组,但显然我不能。对于上面的示例,我需要的值是 "rate"、"interest" 和 "principal".
有解决办法吗?我自己的努力使我 to here 在他们提到使用
的地方
"matcher() with while… find()".
我不完全理解正则表达式,希望得到任何帮助。谢谢。
这是一种使用相对简单的正则表达式的方法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String simple = "(rate:real;interest,principal:real)";
String regex = "(\w+:|\w+,)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(simple);
while (m.find()) {
System.out.println(m.group().substring(0, m.group().length() - 1));
}
}
}
恐怕我不了解 pascal,但您所使用的名称似乎以冒号或逗号结尾。正则表达式查找这些字符串,然后删除最后一个字符(冒号或逗号)。
我从测试 运行 得到的输出是:
rate
interest
principal
您可以使用 positive lookbehind
作为
((?<=[\(,;])[A-Za-z_]\w*)
正则表达式分解
(
(?<= #Positive look behind
[\(,;] #Finds all position that have bracket, comma and semicolon
)
[A-Za-z_]\w* #After finding the positions, match all the allowed characters in variable name following that position
)
String line = "(rate:real;interest,principal:real)";
String pattern = "((?<=[\(,;])[A-Za-z_]\w*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
while (m.find()) {
System.out.println(m.group(1));
}
我正在尝试使用正则表达式从一串 Pascal 代码中提取参数名称,这是我尝试使用的最复杂的方法。请注意,永远不会有白色 space,括号将始终存在。
(rate:real;interest,principal:real)
我目前得到的回复如下:
[(](?:([\w]*)(?:[:][\w])?[;|,]?)*[)]
我希望我可以在 re 传递参数时访问每个捕获组,但显然我不能。对于上面的示例,我需要的值是 "rate"、"interest" 和 "principal".
有解决办法吗?我自己的努力使我 to here 在他们提到使用
的地方"matcher() with while… find()".
我不完全理解正则表达式,希望得到任何帮助。谢谢。
这是一种使用相对简单的正则表达式的方法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String simple = "(rate:real;interest,principal:real)";
String regex = "(\w+:|\w+,)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(simple);
while (m.find()) {
System.out.println(m.group().substring(0, m.group().length() - 1));
}
}
}
恐怕我不了解 pascal,但您所使用的名称似乎以冒号或逗号结尾。正则表达式查找这些字符串,然后删除最后一个字符(冒号或逗号)。
我从测试 运行 得到的输出是:
rate
interest
principal
您可以使用 positive lookbehind
作为
((?<=[\(,;])[A-Za-z_]\w*)
正则表达式分解
(
(?<= #Positive look behind
[\(,;] #Finds all position that have bracket, comma and semicolon
)
[A-Za-z_]\w* #After finding the positions, match all the allowed characters in variable name following that position
)
String line = "(rate:real;interest,principal:real)";
String pattern = "((?<=[\(,;])[A-Za-z_]\w*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
while (m.find()) {
System.out.println(m.group(1));
}