【问题标题】:java Dangling meta character '+' [closed]java悬空元字符'+'[关闭]
【发布时间】:2017-05-09 16:21:05
【问题描述】:

我有文字:

String str = "<HTML> <HEAD>\n" +
            "<TITLE>Управление разрывом строк </Title>\n" +
            "</HEAD>\n" +
            "<BODY>\n" +
            "<marquee>Это моя учебная страница.</marquee>\n" +
            "<H2>Меня зовут <kbd>Ольга. </kbd></H2>\n" +
            "<H3 align=\"center\">Я живу во <em>Владивостоке</em>.</H3>\n" +
            "<H4 align=\"right\">Моя маленькая родина - <font face=\"Academy\" color=\"Red\">Сахалин</font>. </H4>\n" +
            "<H5 align=left>ДВГУ - ВУЗ в котором я работаю.</H5>\n" +
            "<B>Здесь</B>\n" +
            "<I>продемонстрированы</I>\n" +
            "<Blink>различные</Blink>\n" +
            "<U> способы </U>\n" +
            "<KBD>управления </KBD>\n" +
            "<FONT SIZE=5 COLOR=FF80C0>шрифтом:</FONT> его\n" +
            "<FONT SIZE=5 COLOR=FF00FF>цветом</FONT> и\n" +
            "<FONT SIZE=+3 COLOR=FF00FF>размером.</FONT>\n" +
            "</BODY> </HTML>";

我写正则表达式 (?&lt;=(=))[+a-zA-Z0-9]+(?=(&gt;| )) 来查找 manches

  1. 5
  2. FF80C0
  3. 5
  4. FF00FF
  5. +3
  6. FF00FF

但是java抛出异常

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0
+3
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
...

好的。我试试盾 + ((?&lt;=(=))[\\+a-zA-Z0-9]+(?=(&gt;| )))

但这没有用(是同样的错误)。为什么?

代码:

Matcher matcher = Pattern.compile("(?<=(=))[+a-zA-Z0-9]+(?=(>| ))").matcher(str);
    while (matcher.find()) {
        str= str.replaceAll(matcher.group(),'"' + matcher.group() + '"');
    }

【问题讨论】:

  • 因为:FONT SIZE=+3 + 是正则表达式中的一个特殊字符
  • 抛出这个异常的代码在哪里?该错误表明您正在使用+3 作为模式。
  • 我的正则表达式在regex101.com/r/x4Qudo/1和其他在线正则表达式中工作
  • 无法在IDEONE上重现异常
  • @Henry 我添加了代码。对不起

标签: java regex


【解决方案1】:

您的错误与显示的正则表达式无关。

问题是因为您使用匹配的结果值作为replaceAll() 的参数,而这些参数也是正则表达式。

由于您不希望它们被解释为正则表达式,因此您需要对它们进行转义,或者更确切地说“引用”它们,如下所示:

str = str.replaceAll(Pattern.quote(matcher.group()),
                     Matcher.quoteReplacement('"' + matcher.group() + '"'));

更新

但是,如果您只想在匹配的字符串周围加上双引号,为什么不直接使用 replaceAll() 呢?像这样:

    str = str.replaceAll("(?<==)([+a-zA-Z0-9]+)(?=[> ])", "\"$1\"");

【讨论】:

    【解决方案2】:

    你的问题不是来自你的模式,而是来自于

    replaceAll(...)
    

    ReplaceAll 在输入中采用正则表达式。

    您的输入来自您的 str,在某些时候它是“+3”,其中包含一个悬空的 +...

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2013-05-30
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多