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

huus2vyu  于 2023-07-05  发布在  Java
关注(0)|答案(3)|浏览(94)

我有一根这样的弦

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

fhg3lkii

fhg3lkii1#

试试下面的匹配模式。

(?: (?<![/*+-] )(?=length|width|depth))

字符串
输出

length 10 cm
width 2 cm
depth 0.5 cm / length 10 cm
width 2
depth 0.5 cm

pzfprimi

pzfprimi2#

您需要更改正则表达式以正确匹配正确的结果:
下面是一个示例代码,它随您所需的输出一起提供

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


要获得有关正则表达式的更多信息,您可以使用Regex 101 Site并将字符串和正则表达式放在一起以获得解释。

更新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

jtoj6r0c

jtoj6r0c3#

如果您还有其他数据,则拆分可能会导致意外结果,但对于示例,如果您不想保留depth 0.5 cm / length 10 cm,则可以使用用途:

\h(?=width|depth)\b

字符串
Regex demo
拆分后的输出:

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)正向后查找,Assert左边是单词cm
  • \h[\h/]*至少匹配一个水平空白字符,后跟可选的水平空白字符或/
  • |
  • (?<=\d)Assert左边是一个数字
  • \h+匹配1个或多个水平空格字符
  • (?!cm\b)Assert单词cm不在右边

Regex demo
例如

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


Regex demo的|Java demo

相关问题