【问题标题】:Match regular expression with quotes inside?匹配正则表达式与里面的引号?
【发布时间】:2012-11-01 17:45:27
【问题描述】:

我有一个需要使用正则表达式读取的文件。该字符串基本上可以包含任何内容(大写、小写、空格、符号等),只要该行不超过 60 个字符。我尝试的方法适用于文件中的大多数字符串,但是,我还需要能够允许引号,这就是我卡住的地方。这是我迄今为止尝试过的。

    else if (data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$")
            && !label.equals("") && prompt.equals("") && data.length() <= 60)
        {
            prompt = data;
        }

除了下面的字符串之外,它可以很好地读取其他所有内容

    Yes, but an error is displayed, “Fuser out.”

不要询问拼写,这是我收到的示例文件中的内容。

感谢您的帮助,希望我能在离开洗衣店之前得到回复,因为我在长岛,由于飓风,家里没有电或没有互联网。

【问题讨论】:

  • 如果人们过去回答过您的任何问题,您应该考虑返回并通过单击投票箭头下方的复选标记将其标记为“已接受”。 :)
  • 文件可以包含方括号吗?

标签: java regex string expression


【解决方案1】:

在您的正则表达式中添加\",例如下面:

  data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\"\\]+$")

在使用\" 的地方,它将使用" 作为文字进行匹配。

【讨论】:

  • 当前字符类中的\\\"(在正则表达式中变为\")已被解释为文字" 字符。
  • 哦,好吧,有道理。谢谢。尽管在网上进行了更多搜索后,我最终还是简化了它(发现我可以使用句点来匹配所有字符,这让事情变得更容易一些。我将在帖子中发布我的解决方案(因为我接受所有字符。但是,感谢您回答这个问题,这肯定有助于我提高我的正则表达式技能。
  • @audiFanatic 很高兴您找到了解决方案,但您应该注意,尽管此答案实际上并没有改变正则表达式、字符类 ["][\"] 的含义("[\"]" 和 @ 987654331@ 作为 Java 字符串)的处理方式完全相同。
【解决方案2】:

这是从您的代码复制粘贴

 "Yes, but an error is displayed, \"Fuser out.\"".matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$"));

它返回true,所以没关系。

但是当我从您的代码中复制粘贴时遇到了问题。您的字符串“Fuser out.”中的字符“与您的正则表达式中的“不同的字符??

【讨论】:

    【解决方案3】:

    如果有人感兴趣,这就是我最终简化它的方式。

        if (data.matches("\n"))
            {
                // do nothing, ignore
            }
            else if (data.matches("[^ ]+$") && label.equals("")
                && data.length() <= 60)
            {
                label = data;
            }
    
            else if (data.matches(".+$")
                && !label.equals("") && prompt.equals("") && data.length() <= 60)
            {
                prompt = data;
            }
    
            else if (data.matches(".+$")
                && !label.equals("") && !prompt.equals("") && message.equals("")
                && data.length() <= 60)
            {
                message = data;
            }
    
            else if (data.matches("[^ ]+[ ]+[0-9]$") && label.equals("")
                && prompt.equals("") && message.equals("") && data.length() <= 60)
            {
                children = data;
                String[] info = children.split("[ ]+");
                parent = info[0];
                numChildren = Integer.parseInt(info[1]);
    
                tree.getNodeReference(parent).setNumChildren(numChildren);
            }
    

    【讨论】:

      【解决方案4】:

      您可能在匹配该字符串时遇到问题,因为它使用了smart quotes。以下文章对此有一些很好的信息:Handy regexes for smart quotes

      总结是您可以使用以下 Unicode 转义符将这些字符添加到您的正则表达式中:

      \u201C\u201D\u201E\u201F\u2033\u2036
      

      此外,您目前似乎打算通过在正则表达式中使用\"(Java 字符串中的\\\")在字符类中同时允许使用反斜杠和双引号。这不是你想的那样,\" 只会匹配你正则表达式中的文字" 字符,它只是有一个不必要的反斜杠。要真正包含反斜杠作为有效字符,您需要在您的 java 字符串中使用四个连续的反斜杠。

      您还需要对连字符进行转义,否则$-_ 会被解释为一个字符范围。

      所以你的新正则表达式看起来像这样:

      data.matches("[A-Za-z0-9 ,.?!%&()@$\\-_:;\\\\\"\\u201C\\u201D\\u201E\\u201F\\u2033\\u2036]+$")
      

      【讨论】:

      • 不会从文件中排除反斜杠吗?
      • @Asad 刚刚编辑了我的答案以澄清一点。原始正则表达式也不允许在文件中使用反斜杠,如果需要,则需要包含额外的反斜杠(Java 字符串中的两个)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多