【问题标题】:Java is ignoring regex to remove duplicate lines using BlueJJava 忽略正则表达式以使用 BlueJ 删除重复行
【发布时间】:2016-11-24 00:48:15
【问题描述】:

这里真的很绿。我试图让一个在 Notepad++ 中工作的正则表达式使用 BlueJ 在 Java 中运行,但 Java 似乎忽略了它。我正在使用其他使用正则表达式的 replaceAll 函数,并且所有这些函数都在工作。

我有这个,但它告诉我 \s 是非法的转义字符:

    itemList[i] = itemList[i].replaceAll("^(\s*\r\n){2,}", "\r\n");

我阅读了有关 Java 引擎的信息并将 \s 更改为 \s,因此它不是非法的:

    itemList[i] = itemList[i].replaceAll("^(\\s*\r\n){2,}", "\r\n");

我尝试使用 [[:space:]] 代替,但是它仍然没有执行替换功能。

    itemList[i] = itemList[i].replaceAll("^([[:space:]]*\r\n){2,}", "\r\n");

这个 Java 工具正在处理数百行,人们在使用 Notepad++ 删除重复行时遇到了问题。我想也许在格式化工具中这样做会消除这些问题。以下是文本示例:

1.  Modification: No Error Message When SQL Server Down 

              S9# 395 


              Summary 

              No error message when the SQL Server is 
              down. 

              Workaround 

              There is currently no 
              workaround for this issue. The system will become 
              unusable if SQL server is down.

【问题讨论】:

标签: java regex bluej


【解决方案1】:

您需要使用多行模式,所以^ 可以匹配任何行的开头。否则它只匹配整个字符串的开头。多行模式是大多数文本编辑器的默认模式,但在其他任何地方使用正则表达式,您必须指定它。只需将(?m) 添加到正则表达式的开头即可:

(?m)^(\\s*\r\n){2,}

如果您运行的是 Java 8,我建议您改为这样做:

replaceAll("(?m)^(?:\\h*(\\R)){2,}", "$1")

\s* 不明确,因为它可以匹配换行符和空格; \h 仅匹配 horizo​​ntal 空白(例如,空格和制表符)。

\R 匹配任何类型的换行符:\r\n、\n、\r 或其他几个不太常见的换行符。内部组(\R) 捕获最后一个多余的换行符,然后"$1" 将其重新插入。这样,如果有人更改了您文档的换行符格式,您就不会感到任何意外。

【讨论】:

  • 非常感谢,它就像一个魅力!一天多来,我一直在为此发疯,阅读并尝试不同的事情。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2013-08-13
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多