【问题标题】:Java RegEx meta character (.) and ordinary dot?Java RegEx 元字符 (.) 和普通点?
【发布时间】:2021-10-18 06:48:41
【问题描述】:

在Java RegEx 中,如何找出.(dot) 元字符和我们在任何句子中使用的普通点之间的区别。对于像 (*,+,\d,...) 这样的其他元字符如何处理这种情况

【问题讨论】:

    标签: java regex


    【解决方案1】:

    我在 JGrasp 中做一些基本的数组,发现使用 char[][] 数组的访问器方法可以使用 ('.') 来放置单个点。

    【讨论】:

      【解决方案2】:

      如果要结束检查句子是否以“.”结尾,则必须在模式末尾添加 [\.\]$。

      【讨论】:

        【解决方案3】:

        这是可以直接复制粘贴的代码:

        String imageName = "picture1.jpg";
        String [] imageNameArray = imageName.split("\\.");
        for(int i =0; i< imageNameArray.length ; i++)
        {
           system.out.println(imageNameArray[i]);
        }
        

        如果错误地在“.”之前或之后留下空格怎么办?在这种情况下?最好也考虑这些空间。

        String imageName = "picture1  . jpg";
        String [] imageNameArray = imageName.split("\\s*.\\s*");
            for(int i =0; i< imageNameArray.length ; i++)
            {
               system.out.println(imageNameArray[i]);
            }
        

        这里,\\s* 是为了考虑空格,只给你需要的拆分字符串。

        【讨论】:

          【解决方案4】:

          其他成员提出的解决方案对我不起作用。

          但我发现了这个:

          在 java regexp 中转义一个点,写[.]

          【讨论】:

          • 同样,\\. 对我不起作用:\. 抱怨 . 不需要转义,\\. 让它认为它是 \. 而不是 @ 987654327@、\\\. 和构建器抛出错误,[.] 是唯一有效的方法。
          • @mithunc 这很奇怪,字符串文字中的\\. 为您提供\.,这是正则表达式需要将点视为文字点而不是任意字符匹配器的原因。
          • 我过去曾遇到过另一种转义级别的情况,结果是\\\\。在第一层转义后给出 \\.然后下一层给出\。最后正则表达式将其转换为简单的 .我不记得确切何时需要它,但也许它有助于解决您的问题。
          【解决方案5】:

          我想匹配一个以“.*”结尾的字符串 为此,我必须使用以下内容:

          "^.*\\.\\*$"
          

          如果你想起来有点傻:D 这就是它的意思。在字符串的开头可以有任何字符零次或多次,后跟一个点“。”后跟一个星号 (*) 在字符串的末尾。

          我希望这对某人有用。感谢 Fabian 的反斜杠。

          【讨论】:

          • 然后使用"\\.\\*$"。如果对您无关紧要,则无需匹配字符串的开头。
          • 是的,你是对的。老实说,我不记得这个用例了:/
          • 不是真的帮助你,而是帮助其他人看你的帖子:P
          【解决方案6】:

          Perl 风格的正则表达式(Java 正则表达式引擎或多或少基于)将以下字符视为特殊字符:

          .^$|*+?()[{\在字符类之外有特殊意义,

          ]^-\ 在字符类 ([...]) 的内部 中具有特殊含义。

          因此,您需要根据上下文转义那些(并且只有那些)符号(或者,在字符类的情况下,将它们放置在不会被误解的位置)。

          不必要地转义其他字符可能会起作用,但一些正则表达式引擎会将其视为语法错误,例如\_ 将导致 .NET 中的错误。

          其他一些会导致错误的结果,例如\&lt; 在 Perl 中被解释为文字 &lt;,但在 egrep 中表示“单词边界”。

          所以写-?\d+\.\d+\$ 以匹配1.50$-2.00$ 等,[(){}[\]] 用于匹配各种括号/大括号/圆括号的字符类。

          如果您需要将用户输入字符串转换为正则表达式安全形式,请使用java.util.regex.Pattern.quote

          延伸阅读:Jan Goyvaert's blog RegexGuru on escaping metacharacters

          【讨论】:

            【解决方案7】:

            如果您希望正则表达式中的点或其他具有特殊含义的字符成为普通字符,则必须使用反斜杠对其进行转义。由于 Java 中的正则表达式是普通的 Java 字符串,因此您需要转义反斜杠本身,因此您需要两个反斜杠,例如\\.

            【讨论】:

            • 此修复也适用于 bash
            • 请注意,是否转义反斜杠取决于您提供正则表达式的方式。如果硬编码,您确实需要使用:“\\.” ,如果从原始源(例如文本文件)读取,您只使用一个反斜杠:\.
            【解决方案8】:

            使用反斜杠转义特殊字符。 \.\*\+\\d 等等。如果您不确定,您可以转义任何非字母字符,无论它是否特殊。请参阅the javadoc for java.util.regex.Pattern 了解更多信息。

            【讨论】:

            • 不必要地转义非特殊字符可能在某些语言中有效,但在其他语言中可能会失败,因此最好不要养成这种习惯。
            • 这个问题是专门关于 Java 的,docs.oracle.com/javase/6/docs/api/java/util/regex/… 说“可以在非字母字符之前使用反斜杠,无论该字符是否是未转义结构的一部分。”
            猜你喜欢
            • 1970-01-01
            • 2021-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-10
            相关资源
            最近更新 更多