提问人:srkprasad 提问时间:11/9/2023 最后编辑:InSyncsrkprasad 更新时间:11/10/2023 访问量:92
如何在 java 中使用正则表达式拆分字符串
How to split a string by using regex in java
问:
我有一个这样的字符串
length 10 cm width 2 cm depth 0.5 cm / length 10 cm width 2 depth 0.5 cm
我想得到这样的输出
length 10 cm
width 2 cm / width 2
depth 0.5 cm
我试过这个
public static void main(String []args) {
String s = "length 10 cm width 2 cm depth 0.5 cm";
String[] tok = s.split("(?<=\\d)\\s");
for(int i=0; i< tok.length; i++) {
System.out.println(tok[i]);
}
}
它返回:
length 10
cm width 2
cm depth 0.5
cm
答:
1赞
Ali Malek
11/9/2023
#1
您需要更改正则表达式以正确匹配正确的结果:
下面是所需输出附带的示例代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String s = "length 10 cm width 2 cm depth 0.5 cm";
Pattern pattern = Pattern.compile("(\\w+\\s\\d+\\.?\\d*\\s\\w+)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
输出将是:
length 10 cm
width 2 cm
depth 0.5 cm
要获取有关正则表达式的更多信息,您可以使用正则表达式 101 站点并放置字符串和正则表达式来获取解释。
更新 1
为了实现动态解决方案,下面的代码可以帮助你,在这种情况下,你还需要确定单位。我假设您拥有并且对于更多单位,您需要将它们添加到正则表达式中。cm
mm
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String s = "length 10 cm width 2 depth 0.5 cm extra 5 mm";
Pattern pattern = Pattern.compile("(\w+\s\d+\.?\d*(\s(cm|mm))?)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
输出将是:
length 10 cm
width 2
depth 0.5 cm
extra 5 mm
评论
0赞
srkprasad
11/9/2023
谢谢阿里·马利克,你能帮帮我吗,对于这个输入“长 10 厘米宽 2 深 0.5 厘米”的任何可能的动态解决方案
0赞
Ali Malek
11/9/2023
@srkprasad 动态求解是什么意思?如果你举出更多的例子,那就太好了。
0赞
srkprasad
11/9/2023
有时我们不添加单位 (cm),给定输入文本,例如“长 10 宽 2 深 0.5 厘米”,我想要输出长 10 宽 2 深 0.5 厘米
0赞
Ali Malek
11/10/2023
如果您始终使用此正则表达式作为单位,则此正则表达式将帮助您 => 。否则,您需要添加您喜欢的其他单位,正则表达式将是 => '(\w+\s\d+\.?\d*(\s(cm|mm))?)cm
(\w+\s\d+\.?\d*(\scm)?)
mm
0赞
Ali Malek
11/10/2023
@srkprasad 请参阅 Update 1 部分
1赞
The fourth bird
11/10/2023
#2
如果您还有其他数据,拆分可能会导致意外结果,但例如,如果您不想保留,则可以使用:depth 0.5 cm / length 10 cm
\h(?=width|depth)\b
拆分后的输出:
length 10 cm
width 2 cm
depth 0.5 cm / length 10 cm
width 2
depth 0.5 cm
如果您不想将所有单位放在单独的行上,请执行以下操作: /
(?<=\bcm)\h[\h/]*|(?<=\d)\h+(?!cm\b)
模式匹配
(?<=\bcm)
积极地向后看,断言左边是这个词cm
\h[\h/]*
匹配至少一个水平空格字符,后跟可选的水平空格字符或/
|
或(?<=\d)
断言左边是一个数字\h+
匹配 1 个或多个水平 whitspace 字符(?!cm\b)
断言这个词不在右边cm
例
String s = "length 10 cm width 2 cm depth 0.5 cm / length 10 cm width 2 depth 0.5 cm";
String[] tok = s.split("(?<=\\bcm)\\h[\\h/]*|(?<=\\d)\\h+(?!cm\\b)");
for (int i = 0; i < tok.length; i++) {
System.out.println(tok[i]);
}
输出
length 10 cm
width 2 cm
depth 0.5 cm
length 10 cm
width 2
depth 0.5 cm
但是匹配将允许更精确的匹配,您可以根据需要进行调整以匹配更多单位类型。
请注意,在 Java 中对反斜杠进行双重转义。
\b(?:leng|wid|dep)th\h+\d+(?:\.\d+)?(?:\h+cm)?\b
1赞
Reilas
11/10/2023
#3
请尝试以下匹配模式。
(?: (?<![/*+-] )(?=length|width|depth))
输出
length 10 cm
width 2 cm
depth 0.5 cm / length 10 cm
width 2
depth 0.5 cm
评论