【问题标题】:Regular expression in java not workingjava中的正则表达式不起作用
【发布时间】:2016-11-22 20:41:21
【问题描述】:

我将 excel 文件转换为 CSV 文件,然后将其转换为字符串。

问题是正则表达式无法正常工作

我想检测这种文字:

MYW Pkg、MYW Pkg + 快速服务餐饮、MYW Pkg + 餐饮、MYW Pkg + 豪华餐厅,

房间 + 门票 + 快餐服务

我有一个字符串数组。 所以我需要知道一个模式,我试试这个但它没有检测到它:

Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z]{3})+(\\s)+(\\+)");

例如,我尝试匹配“MYW Pkg +”, 你知道它为什么不工作吗?

更多代码:

chain 是具有“MYW Pkg”等值的数组

Pattern patPackageDescription = Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z])+(\\s)+(\\+)");
        for (int i = 0; i < chain.length; i++) {
            Matcher matPackageDescription = patPackageDescription
                    .matcher(chain[i]);

            if (matPackageDescription.matches()) {
                String space = String.format("%1$-" + 50 + "s",
                        chain[i].toString());
                a.append(space + "|\n");
            }
        }

问候。

【问题讨论】:

  • 您要匹配上述字符串的哪些部分。我要指出的两件事是 1)(?) 很奇怪/很可能没有必要,2)您正在寻找 [A-Z]+ 就在 \\+ 之前(即使 Pkg+ 之间有空格) .
  • @Sam 我至少尝试匹配“MYW Pkg +”,而 anubhava (?) 不区分大小写?
  • 内联不区分大小写的修饰符看起来像(?i:[A-Z]),但你可以只使用[A-Za-z]
  • 仍然没有达到任何结果:(我将正则表达式添加到问题中
  • 向我们展示更多代码

标签: java regex formatter


【解决方案1】:

matches() 方法尝试将整个字符串与模式匹配,要匹配字符串的一部分,您需要使用find() 方法。

String str = "MYW Pkg, MYW Pkg + Quick Service Dining, MYW Pkg + Dining, MYW Pkg + Deluxe Dining,";
Pattern patPackageDescription = Pattern.compile("([A-Za-z]{3}\\s)+\\+");
Matcher matPackageDescription = patPackageDescription.matcher(str);

while (matPackageDescription.find()) {
    System.out.println(matPackageDescription.group());
}

输出:

MYW Pkg +
MYW Pkg +
MYW Pkg +

查看here 以获得解释。

【讨论】:

  • 你说的对吗我添加 (.*) 以获得正确的匹配.. 所以 ([A-Za-z]{n}\\s)+(\\+)+([ A-Za-z]{n}\\s)+(\\+)+(.*) 这应该适用于这些情况:MYW Pkg + Quick Service Dining , Room + Tickets + Quick Service Dining.....对吗?
  • 如何将 n 放置在任何数字上?
  • @arnoldssss,告诉我你到底需要做什么 =) 所以我可以帮你。
  • 我需要在我的字符串数组中检测,例如:房间 + 门票 + 快速服务餐饮、MYW Pkg + 快速服务餐饮。所以我需要知道......为什么这个正则表达式不起作用 "([A-Za-z]{1,}\\s)+(\\+)+([A-Za-z]{1,} \\s)+(\\+)+(.*)"
  • 哦,我现在看到了我的问题.. 两个字符串都存在差异......我会给你很好的答案.. 谢谢
【解决方案2】:

您的问题是您使用的Matcher.matches() 需要完全匹配,如果您可以使用find() 进行部分匹配或添加.* 以匹配搜索字符串之后的任何内容。

([A-Z]{3})+(\s)+([A-Za-z]{3})+(\s)+(\+).*

Debuggex Demo

【讨论】:

  • 酷我添加它.. 所以 ([A-Za-z]{n}\\s)+(\\+)+([A-Za-z]{n}\\ s)+(\\+)+(.*) 这应该适用于这些情况:MYW Pkg + Quick Service Dining And Room + Tickets + Quick Service Dining 对吗?
  • 如果你的字符串从数字开始,它会失败。你也需要在你的正则表达式的开头添加.*?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2015-03-20
相关资源
最近更新 更多