【问题标题】:Regex flexible remove dash between characters only正则表达式灵活删除字符之间的破折号
【发布时间】:2022-01-17 19:21:31
【问题描述】:

我只需要删除字符之间的破折号,但我这样做的方式是我需要运行两个单独的 replaceAll 命令 - 有没有办法只用一个?它必须允许法语字符。

.replaceAll("([a-zA-ZÀ-ÿ])-([a-zA-ZÀ-ÿ])", "$1 $2")

想要的结果是这样的:

Pourquoi s'intéresse-t-elle à lui.
Ma chère je comptais là-dessus - figurez-vous.
Il y a 1-2 chemins que nous pouvons choisir.

到这里:

Pourquoi s'intéresse t elle à lui
Ma chère je comptais là dessus - figurez vous.
Il y a 1-2 chemins que nous pouvons choisir.

使用上述模式,我只能修复第二句或调整第一句,但我想用一个模式修复它们..

正则表达式匹配第一句:

https://regex101.com/r/fHQNYP/1

并匹配第二句:

https://regex101.com/r/j4YGrj/1

【问题讨论】:

  • @user7294900 您没有链接到答案,只是链接到整个问题。无论如何,这似乎行不通。
  • @Izruo 调整为([a-zA-ZÀ-ÿ])-([a-zA-ZÀ-ÿ])-([a-zA-ZÀ-ÿ])。这种调整使它适用于第一句话。原始模式适用于第二句。
  • @Izruo 为了清楚起见,我添加了两个正则表达式模式以匹配每个句子到我的问题中。
  • @Izruo 您的模式如何避免删除第二句中没有被字符包围的破折号?
  • @Hasen 我刚刚发现(并从模式中读取)关键的破折号在 intéresse-t-ellelà-dessus 中。在我只是看到一个剩余的破折号周围有空格并因此假设它是我们正在寻找的东西之前。因此我提出的建议是错误的,我将删除我的评论。

标签: java regex


【解决方案1】:

这是替换所有破折号的正则表达式。

stringValue.replaceAll("[-]", " ")

这是用于替换单词之间的破折号。

stringValue.replaceAll("(\\b-\\b)", " ")

这已经晚了,但为答案工作:

stringValue.replaceAll("(^[a-zA-ZÀ-ÿ](?<![a-zA-ZÀ-ÿ])(?=[a-zA-ZÀ-ÿ])|(?<=[a-zA-ZÀ-ÿ])(?![a-zA-ZÀ-ÿ])-(?<![a-zA-ZÀ-ÿ])(?=[a-zA-ZÀ-ÿ])|(?<=[a-zA-ZÀ-ÿ])(?![a-zA-ZÀ-ÿ])$[a-zA-ZÀ-ÿ])", " ")

【讨论】:

  • 我相信其目的是专门替换两个字符之间的破折号,而不仅仅是所有破折号
  • 请删除你的答案,这显然没有像 dshelya 正确指出的那样回答它。
  • 我已经编辑过了。
  • 制作一个正则表达式,显示它删除了例句中的破折号。
  • 它确实适用于我提供的示例,但我的代码使用[a-zA-ZÀ-ÿ] 仅检测字母字符。你能让你的模式避免使用数值吗?
【解决方案2】:

这是一个棘手的问题。一方面,您需要指定所有重音字符。你不能使用\w,因为那只会包括非重音。尽管如此,像-t- 这样的模式意味着第二个字符必须声明为零宽度。

所以,我认为这可以解决这两个问题:

"Pourquoi s'intéresse-t-elle à lui. Ma chère je comptais là-dessus - figurez-vous."
.replaceAll("([a-zA-Z\\u00C0-\\u017F])-((?=[a-zA-Z\\u00C0-\\u017F]))", "$1 $2");

【讨论】:

  • 请将您的代码格式化为单独的行,这样不可读。
【解决方案3】:

您无法匹配t 单词两端的连字符,因为正则表达式中尾随的([a-zA-ZÀ-ÿ]) 会消耗t,并且正则表达式无法在下一次迭代中再次匹配它。看看:

Pourquoi s'intéresse-t-elle à lui.
                    ^^^
                      First match (replace with " t ")

Pourquoi s'intéresse-t-elle à lui.
                       ^
                       +-- search goes on from here, no more matches!

您只想匹配字母之间的连字符,所以使用

.replaceAll("(?<=\\p{L})-(?=\\p{L})", " ")

请参阅regex demo详情

  • (?&lt;=\p{L}) - 与紧接在任何 Unicode 字母前面的位置相匹配的正向回溯
  • - - 一个连字符
  • (?=\p{L}) - 与紧跟任何 Unicode 字母的位置匹配的正向前瞻。

【讨论】:

  • 哇,看起来我们可能会有赢家。即使我在问题中添加了新句子,这似乎也有效。
  • @Hasen Lookarounds 是零宽度断言,它们匹配空字符串,并且只返回 true 或 false,让正则表达式引擎知道是继续匹配还是失败并回溯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多