【问题标题】:Extracting words with - included upper lowercase not working for words it only extracts chars提取带有 - 包含的大写小写的单词不适用于仅提取字符的单词
【发布时间】:2018-12-31 10:33:23
【问题描述】:

我正在尝试使用正则表达式匹配器 &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'"

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

【问题讨论】:

  • 我没有正确阅读您的问题,因为 Aleksei 在上面提出了建议,但为了将来参考,我认为 /W 应该是 \W 甚至可能是 \\W 因为你必须逃脱字符
  • 使用这个[\w-]+regex101.com/r/rPDZwg/2
  • @AlekseiMatiushkin 我认为你需要在你的模式中添加双重转义
  • @CodeManiac 你建议的模式有问题。
  • 谢谢大家,@Code Maniac 的建议完美无缺,您使用的工具很棒。

标签: java regex class matcher


【解决方案1】:

您可以使用它,因为您希望在匹配中包含 character digit-

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

Demo

【讨论】:

  • 一种可能的极端情况:术语"Hello World", ... 出现在输入中。您的正则表达式将无法区分转义和未转义的空格(顺便说一下,我的回答也有问题)
  • @TimBiegeleisen 我认为您在解决方案中也错过了这一点,因为您使用空格或逗号分隔。无论如何感谢您指出。将更新以使其更通用
【解决方案2】:

这里最简单的解决方案似乎是整体放弃正则表达式,而只是拆分字符串。您希望在您的文字中允许使用数字、字母字符和-。考虑以下代码:

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

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

这样做是将输入字符串拆分为与您想要的字符匹配的所有内容。这是通过使用反转字符类来完成的。

【讨论】:

  • 仅供参考,您在拆分函数中使用的模式是正则表达式:)
  • 嘘 :) 不要破坏它
【解决方案3】:

我会建议一个正则表达式拆分,然后是一个正则表达式替换:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多