【问题标题】:Java Regex to regex to remove double hyphens and keep single onesJava 正则表达式到正则表达式以删除双连字符并保留单个连字符
【发布时间】:2014-11-17 22:24:08
【问题描述】:

所以我需要一个从文本中删除所有非单词字符(空格和连字符除外)的正则表达式,这样我就可以计算文本中的单词数。 像

String().replaceAll("[^\\p{L}+(?:\\-\n?\\p{L}+)* ]", "")

大部分都有效,因为它保留了连字符,但是当我得到一个双连字符时就会出现问题。美式英语中的双连字符应该代表一个破折号,所以在我的情况下,我也需要用空格替换它。有谁知道如何修改它以免发生这种情况?

这是一个例子。下面这句话:

当我在校外时,我失去了所有的财物——钱包、钥匙,一切!

在正则表达式之后应该是这样的:

当我在校外时,我丢失了我所有的财物钱包钥匙

编辑 - 我对使用两个 replaceAll 不感兴趣,我想在一个正则表达式中完成。

【问题讨论】:

  • 你能举一些例子吗?
  • 你为什么不做第二个replaceAll 而不是试图让正则表达式更复杂? replaceAll("-+", "-")
  • 例如,“校外”将不受此正则表达式的影响,这正是我想要的。但是类似于以下句子:“我失去了所有的工作——物理、数学等。”会保留双连字符,然后我会有一个像 work-physics 这样的词,这是我不想要的。我不想用两个 replaceAlls 来做的原因是因为我很好奇用一个正则表达式来做。
  • 您对什么感兴趣并不重要,但不能在一个 replaceAll 调用中完成 2 个不同的替换。

标签: java regex hyphen


【解决方案1】:

您的原始正则表达式已损坏,因为 (?:...)*+ 被视为字符类 [] 中的文字字符。

在 Java 的字符类中,[]\(用于转义序列和属性)、\Q\E(用于引用字符类中的特殊字符)、^(仅在类开头有效)、-(在 2 个字符之间有效)、&&(用于字符类交集)是唯一具有特殊含义的字符/序列。

您可以针对此示例字符串测试您的正则表达式以确认我上面所说的内容。

这是另一个例子:(括号)+ [括号] +(星号*)

您可以直接将单词与此正则表达式(正则表达式的字符类中的部分)匹配,而不是删除无效字符和东西:

"\\p{L}+(?:-\n?\\p{L}+)*"

上面的正则表达式可以在 Matcher 循环中使用来计算单词的数量:

Pattern p = Pattern.compile("\\p{L}+(?:-\n?\\p{L}+)*");
Matcher m = p.matcher(input);
int count = 0;

while (m.find()) {
   count++;
}

如果您仍想替换与上述正则表达式中定义的“单词”定义不匹配的所有字符:

input.replaceAll("(?s).*?(\\p{L}+(?:-\n?\\p{L}+)*)|.+", "$1 ");

(?s).*?(\\p{L}+(?:-\n?\\p{L}+)*) 在“word”之前搜索非“word”字符,并删除它们,并在“word”之后添加一个空格。末尾的.+ 处理字符串末尾的非“单词”字符序列。

请注意,如果最后一个字符不是“单词”的一部分,它将产生一个尾随空格。

Demo on regex101

测试输入:

While I was off-campus, I lost all my belongings--wallet, keys, everything!

This is another example: (parentheses) + [brackets] + (asterisks *)

Along-
longl-
onglo-
ngword!

测试输出(注意末尾的尾随空格):

While I was off-campus I lost all my belongings wallet keys everything This is another example parentheses brackets asterisks Along- longl- onglo- ngword 

如果您问我是否可以通过修改上面的正则表达式来消除尾随空格,我会说 not 在 Java 中是可能的。这里的问题是--必须替换为空格来分隔两个“单词”,而其他非“单词”字符必须替换为空字符串。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多