Java 正则表达式以可变空格和定界符拆分字符串
Java regex to split string with variable spaces and delimiter
给定一个单行字符串,例如
a b c d => e f g 1 2
带有双分隔符(space
和 =>
)的模式
" +( +|\=> *)?"
生成以下 9 个字段作为 Java
中 String.split()
的输出:
a, b, c, d, e, f, g, 1, 2
但是,如果输入字符串使用像“1 M”这样的符号来表示数字“100万”,即
a b c d => e f g 1 m 2
这个模式毫不奇怪地产生了 10 个字段(m
是额外的一个)。
是否可以修改模式以可靠地将 1
和 m
分组为 1 m
,其他一切都相同,在 String.split()
中?
这会根据 =>
或后面没有 m
的空格拆分输入。
String s = "a b c d => e f g 1 m 2";
String[] parts = s.split("\s*=>\s*|\s+(?!m)");
System.out.println(Arrays.toString(parts));
输出:
[a, b, c, d, e, f, g, 1 m, 2]
或
String s = "a b c d => e f g 1 m 2";
String[] parts = s.split("\s*=>\s*|(?<!\d)\s+(?!m)");
System.out.println(Arrays.toString(parts));
拆分前面没有数字或后面没有 "m" 的空格:
str.split("((?<!\d) | (?!m))+(\=> *)?"
仅供参考,“+”作为可选组中的替代项是多余的,因为初始“+”会占用所有空格。
给定一个单行字符串,例如
a b c d => e f g 1 2
带有双分隔符(space
和 =>
)的模式
" +( +|\=> *)?"
生成以下 9 个字段作为 Java
中 String.split()
的输出:
a, b, c, d, e, f, g, 1, 2
但是,如果输入字符串使用像“1 M”这样的符号来表示数字“100万”,即
a b c d => e f g 1 m 2
这个模式毫不奇怪地产生了 10 个字段(m
是额外的一个)。
是否可以修改模式以可靠地将 1
和 m
分组为 1 m
,其他一切都相同,在 String.split()
中?
这会根据 =>
或后面没有 m
的空格拆分输入。
String s = "a b c d => e f g 1 m 2";
String[] parts = s.split("\s*=>\s*|\s+(?!m)");
System.out.println(Arrays.toString(parts));
输出:
[a, b, c, d, e, f, g, 1 m, 2]
或
String s = "a b c d => e f g 1 m 2";
String[] parts = s.split("\s*=>\s*|(?<!\d)\s+(?!m)");
System.out.println(Arrays.toString(parts));
拆分前面没有数字或后面没有 "m" 的空格:
str.split("((?<!\d) | (?!m))+(\=> *)?"
仅供参考,“+”作为可选组中的替代项是多余的,因为初始“+”会占用所有空格。