提取带有-的单词(包括大写小写字母)不适用于单词,它仅提取字符

时间:2018-12-31 10:33:24

标签: java regex class matcher

我正在尝试使用正则表达式匹配器&pattern从字符串中提取几个单词。我确实花了一些时间来制作我正在使用的正则表达式,但这无法按预期工作,非常感谢您的帮助。

我制作了我正在使用的正则表达式,但这不能按预期工作,有些帮助会很大。我可以从想要的单词中提取字符,但不能从整个单词中提取字符。

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {

public static void main (String[] args){

    String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";


    Pattern pattern = Pattern.compile("[((a-zA-Z1-9-0)/W)]");

    Matcher matcher = pattern.matcher(mebo);


    while (matcher.find()) {

        System.out.printf("Word is %s %n",matcher.group(0));

    }

}
}
  

这是当前输出:

     

单词是1单词是3单词是2单词是3单词是9单词是9单词   是B字是I字是M字是C字是P字是1字是2   字是B字是M字是W字是Q字是-字是C字   是S单词是P单词是S单词是-单词是D单词是1单词是0   单词是1单词是9单词是2单词是2单词是9单词是2单词   是2个单词是9

============

我的期望是迭代整个单词,例如:

字符串mebo =“ 1323 99BIMCP 1 2 BMWQ-CSPS-D1,0192,'29229'”

  

单词是1323单词是99BIMCP单词是1单词是2单词是BMWQ-CSPS-D1   单词是0192单词是29229

3 个答案:

答案 0 :(得分:0)

这里最简单的解决方案似乎是抛弃正则表达式,而只是拆分字符串。您想在单词中使用数字,字母字符和-。考虑以下代码:

for (String word : mebo.split("[^\\d\\w-]+")) {
    System.out.printf("Word is %s %n", word);
}

这应该表现出所需的行为。请注意,除非拆分模式中有+,否则这将生成一些空字符串。

这是在不匹配的所有字符之间拆分输入字符串。这可以通过使用反向字符类来实现。

答案 1 :(得分:0)

我建议进行正则表达式拆分,然后替换正则表达式:

String mebo = "1323 99BIMCP 1 2 BMWQ-CSPS-D1, 0192, '29229'";
String[] parts = mebo.split("\\s*,?\\s+");
for (String part : parts) {
   System.out.println(part.replaceAll("[']", ""));
}

1323
99BIMCP
1
2
BMWQ-CSPS-D1
0192
29229

这里的逻辑是在空格上分割,可能包括逗号分隔符。然后,我们可以进行正则表达式替换清理,以删除流浪字符,例如单引号。双引号和任何其他不需要的字符可以轻松添加到用于替换的字符类中。

通常,仅靠正则表达式可能不足以解决此问题,并且可能需要解析器才能涵盖所有边缘情况。例如,考虑以下输入行:

One, "Two or more", Three

我的回答在这里失败了,因为它盲目地在空格上拆分,并且不知道转义的空格不是令牌。正则表达式也会在这里失败。

答案 2 :(得分:0)

您可以在正则表达式中使用它,因为您想在比赛中包含character digit-

`[\w-]+`
  • [\w-]+-匹配(a-z 0-9 _和-)一次或多次。

Demo