【问题标题】:Which is the right regular expression to use for Numbers and Strings?哪个是用于数字和字符串的正确正则表达式?
【发布时间】:2015-07-08 17:14:29
【问题描述】:

我正在尝试创建简单的 IDE 并基于

为我的 JTextPane 着色
  • 字符串 (" ")
  • 评论(// 和 /* */)
  • 关键字(public、int ...)
  • 数字(69 等整数和 1.5 等浮点数)

我为源代码着色的方法是覆盖 StyledDocument 中的 insertString 和 removeString 方法。

经过多次测试,我已经完成了cmets和关键字。

Q1:至于我的字符串着色,我根据这个正则表达式为我的字符串着色:

Pattern strings = Pattern.compile("\"[^\"]*\"");
Matcher matcherS = strings.matcher(text);

while (matcherS.find()) {
    setCharacterAttributes(matcherS.start(), matcherS.end() - matcherS.start(), red, false);
}

这在 99% 的情况下都有效,除非我的字符串包含特定类型的字符串,其中代码中有一个“\”。这会弄乱我的整个颜色编码。 谁能更正我的正则表达式来修复我的错误?

Q2:对于整数和小数着色,根据这个正则表达式检测数字:

Pattern numbers = Pattern.compile("\\d+");
Matcher matcherN = numbers.matcher(text);
while (matcherN.find()) {
    setCharacterAttributes(matcherN.start(), matcherN.end() - matcherN.start(), magenta, false);
}

通过使用正则表达式“\d+”,我只处理整数而不是浮点数。此外,作为另一个字符串一部分的整数被匹配,这不是我在 IDE 中想要的。哪个是整数颜色编码的正确表达式?

下面是输出的截图:

提前感谢您的帮助!

【问题讨论】:

标签: java regex jtextpane styleddocument


【解决方案1】:

对于字符串,这可能是最快的正则表达式 -

"\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\""

格式化:

 " [^"\\]* 
 (?: \\ . [^"\\]* )*
 "

对于整数和十进制数,我所知道的唯一万无一失的表达式是
这 -

"(?:\\d+(?:\\.\\d*)?|\\.\\d+)"

格式化:

 (?:
      \d+ 
      (?: \. \d* )?
   |  \. \d+ 
 )

附带说明,如果您从一开始就独立完成每个操作
您可能会重叠突出显示的字符串。

【讨论】:

    【解决方案2】:

    尝试:

    1. \\b\\d+(\\.\\d+)?\\b 用于 int、float 和 double,
    2. "(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)" 用于字符串,

    【讨论】:

      【解决方案3】:

      对于整数使用

      (?<!(\\^|\\d|\\.))[+-]?(\\d+(\\.\\d+)?)(?!(x|\\d|\\.))
      

      【讨论】:

        【解决方案4】:
        1. 忽略 \" 情况匹配字符串

          ".*?(?&lt;!\\)"

        一旦看到",上面将开始匹配,并且它将继续匹配任何东西,直到它到达下一个",它前面没有\。这是通过使用http://www.regular-expressions.info/lookaround.html 中很好解释的lookbehind 功能实现的

        1. 匹配所有带小数点和不带小数点的数字

        (\d+)(\.\d+)? 会给你至少一个数字,后跟一个点,以及任何大于 1 的其他数字。

        1. 字符串中的数字匹配问题可以通过两种方式实现:

          • a 修改上述内容,以便它们必须在任一侧存在空格 \W(\d+)(\.\d+)?\W,我认为这在数学情况(即 10+10)或表达式末尾不会令人满意(即 10 个;)。

          • b 将此作为优先事项。如果在数字之后检查字符串着色,则字符串的该部分将首先被着色为粉红色,但随后立即被红色覆盖。字符串着色优先。

        【讨论】:

        • 我想我现在也为您的字符串问题找到了解决方案。看看编辑后的答案".*?(?&lt;!\\)"
        【解决方案5】:

        R1:我相信对于正在进行的字符串中间的非转义 " 字符没有基于正则表达式的答案。您需要根据您的特定语法规则(您未指定)主动处理文本以消除或规避不匹配字符的误报。

        但是: 如果您的意思是像 java 一样简单地忽略转义的 \",那么我相信您可以简单地将 escape+quote 对包含在中心作为一个组,而贪婪的 * 将负责其余的工作: \"((\\\\\")|[^\"])*\"

        R2: 我相信下面的正则表达式可以用于查找整数和分数: \\d+(\.\\d+)?

        您也可以扩展它以查找其他类型的数字。例如,\\d+([\./]\\d+)? 将额外匹配诸如“1/4”之类的数字。

        【讨论】:

          猜你喜欢
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          • 2018-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多