如何在 java 中使用正则表达式拆分字符串

How to split a string by using regex in java

提问人:srkprasad 提问时间:11/9/2023 最后编辑:InSyncsrkprasad 更新时间:11/10/2023 访问量:92

问:

我有一个这样的字符串

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
Java 正则表达式

评论


答:

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

为了实现动态解决方案,下面的代码可以帮助你,在这种情况下,你还需要确定单位。我假设您拥有并且对于更多单位,您需要将它们添加到正则表达式中。cmmm

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

正则表达式演示 |Java 演示

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