java - 当字符串被 (a-z) 包围时,从字符串中删除破折号,但不要从中间删除破折号

标签 java regex string

我读过类似的问题,但这些问题并不能完全回答我的问题。

我想从字符串中删除任何破折号,但不想删除字符串中间被 (a-z) 或 (A-Z) 包围的破折号,就像我的示例测试用例一样。

我已经使用了这个正则表达式代码,但它清除了所有破折号:

string.replaceAll("\\-", "");
<小时/>

测试用例

  • --好
  • -好
  • g-ood*
  • g--ood
  • 好-
  • 好——
<小时/>

结果

  • g-ood*

最佳答案

使用正则表达式来做到这一点是正确的做法。但是,您的正则表达式正在捕获每个连字符。您需要的是检查前后的字母。

((?<!\w)-|-(?!\w))

此正则表达式将查找前面没有任何内容的连字符后面没有任何内容的连字符并替换它们。

Regular expression visualization

使用此正则表达式,您可以将这些出现的内容替换为空,就像您之前所做的那样。

string.replaceAll("((?<!\\w)-|-(?!\\w))", "");

here is a regex101 for you to test more cases

关于java - 当字符串被 (a-z) 包围时,从字符串中删除破折号,但不要从中间删除破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61109658/

相关文章:

java - 是否有真实世界的 Spring 和 Hibernate 示例的来源?

java - Spring 集成 - 在流之间传递数据

Java 编译正则表达式错误

使用utf8proc将c++字符串转换为utf8有效字符串

java - FileNotFoundException 但文件确实存在

c# - : Must contain a numeric, 的正则表达式不包括 "SomeText1"

regex - W3C 规范建议的电子邮件正则表达式模式是否容易受到 ReDoS 攻击?

java - 附加到文件时,如果条件总是失败

c - 字符串不打印。它只打印字符 - c 中的 'surname' 变量

java - Sonarqube 未正确显示 Java 项目的测试覆盖率