用于匹配不同大小向量中最后一个数字的正则表达式
RegEx for matching the last number in vectors of different sizes
我有这个字符串:
values="[72, 216, 930],[250],[72],[228, 1539],[12]";
我正在尝试组合两种模式以获得第一个 [] 类型中的最后一个数字和第二个 [] 类型中的数字。
pattern="\, ([0-9]+)\]|\[([0-9]+)\]"
但它输出空值:
930, null, null, 1539, null
我该如何解决这个问题?
试试这个。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = ", ([0-9]+)]";
final String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
输出:
Full match: , 930]
Group 1: 930
Full match: , 1539]
Group 1: 1539
这里,我们可能不想从左边绑定,直接用右边的]
,然后向左滑动收集我们的数字,可能类似于this expression:
([0-9]+)\]
图表
此图显示了它的工作原理:
如果喜欢,我们也可以从左边开始绑定,类似this expression:
([\[\s,])([0-9]+)(\])
图表
此图显示了第二个的工作原理:
package Sample;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Whosebug{
final static String regex = "\d*]";
final static String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
final static Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final static Matcher matcher = pattern.matcher(string);
public static void main(String[] args) {
while (matcher.find()) {
String val = matcher.group(0).replace("]", "");
System.out.println(val);
}
}
}
输出
930
250
72
1539
12
为了确保数据实际位于方括号之间,您可以使用捕获组,以 [
开始匹配并以 ]
结束匹配
\[(?:\d+,\h+)*(\d+)]
在Java
\[(?:\d+,\h+)*(\d+)]
\[
匹配 [
(?:\d+,\h+)*
重复 0+ 次匹配 1+ 个数字、逗号和 1+ 个水平空白字符
(\d+)
在组 1 中捕获匹配 1+ 个数字
]
匹配右方括号
例如:
String regex = "\[(?:\d+,\h+)*(\d+)]";
String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
结果:
930
250
72
1539
12
我有这个字符串:
values="[72, 216, 930],[250],[72],[228, 1539],[12]";
我正在尝试组合两种模式以获得第一个 [] 类型中的最后一个数字和第二个 [] 类型中的数字。
pattern="\, ([0-9]+)\]|\[([0-9]+)\]"
但它输出空值:
930, null, null, 1539, null
我该如何解决这个问题?
试试这个。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = ", ([0-9]+)]";
final String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
输出:
Full match: , 930]
Group 1: 930
Full match: , 1539]
Group 1: 1539
这里,我们可能不想从左边绑定,直接用右边的]
,然后向左滑动收集我们的数字,可能类似于this expression:
([0-9]+)\]
图表
此图显示了它的工作原理:
如果喜欢,我们也可以从左边开始绑定,类似this expression:
([\[\s,])([0-9]+)(\])
图表
此图显示了第二个的工作原理:
package Sample;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Whosebug{
final static String regex = "\d*]";
final static String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
final static Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final static Matcher matcher = pattern.matcher(string);
public static void main(String[] args) {
while (matcher.find()) {
String val = matcher.group(0).replace("]", "");
System.out.println(val);
}
}
}
输出
930
250
72
1539
12
为了确保数据实际位于方括号之间,您可以使用捕获组,以 [
开始匹配并以 ]
\[(?:\d+,\h+)*(\d+)]
在Java
\[(?:\d+,\h+)*(\d+)]
\[
匹配[
(?:\d+,\h+)*
重复 0+ 次匹配 1+ 个数字、逗号和 1+ 个水平空白字符(\d+)
在组 1 中捕获匹配 1+ 个数字]
匹配右方括号
例如:
String regex = "\[(?:\d+,\h+)*(\d+)]";
String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
结果:
930
250
72
1539
12