【问题标题】:Replace full stop between letters with hypen in sentance在句子中用连字符替换字母之间的句号
【发布时间】:2018-07-10 11:17:10
【问题描述】:

不知何故,我得到的一些文本页面似乎在连字符应该是一个句号。

例如,“然后它发生了。先是一只脚,然后是另一只脚。”。如您所见,连字符应该是句号。

我想出了正则表达式来“查找”([a-z][.][a-z]) 所有出现但无法弄清楚“替换”。

当我尝试 [ - ][-][a-z][-][a-z][a-z][ - ][a-z][a-z][ ][-][ ][a-z] 时,它会删除前面单词的最后一个字母和后面单词的第一个字母。

我正在使用文本编辑器 (TextPad)。

我该如何解决这个问题?

【问题讨论】:

  • 你可能会匹配.,而不是被单词边界包围?
  • 如果您使用像您这样的模式,您还将删除缩写中的.。例如。 U.S. -> US.
  • 您使用哪个工具进行搜索和替换? sedperl 还是文本编辑器(哪个)?
  • 幸运的是,所有缩写都是大写的,我想我可以使用 [a-z^A-Z] 删除查找大写字母,尽管我不确定这是否正确。
  • @Socowi。感谢您指出了这一点。我更改了问题并补充说我正在使用文本编辑器。

标签: regex text replace


【解决方案1】:

考虑[.](?=[a-z])

  • 它确实避免了假设它们只是大写的缩写。

  • 它不处理“Then it happened.Winnie the Pooh looked up.”(连字符后面的词是专有名词。)

  • 它也不处理“Then it happened.G.W. Bush looked up.”(连字符后面的单词是缩写。)

要处理这些情况,请考虑(?<![A-Z])[.](?!\s|$)

  • 上面写着.前面的字母不能大写。

  • 它还说后面不应该有空格或行尾。

您可以只用" - " 执行替换,因为正则表达式只使用句点。 (上下文使用lookarounds匹配。)

See the demo.

【讨论】:

    【解决方案2】:

    我没有 TextPad,无法测试我的答案。根据我的阅读,TextPad 应该通过\1$1 支持捕获组。尝试以下方法之一

    搜索([a-z])\.([a-z])并替换为\1 - \2

    搜索 ([a-z])\.([a-z]) 并替换为 $1 - $2

    搜索 \([a-z]\)\.\([a-z]\) 并替换为 \1 - \2

    搜索\([a-z]\)\.\([a-z]\)并替换为$1 - $2

    【讨论】:

    • 感谢@Socowi,但这也删除了“。”之前和之后单词的最后一个和第一个字母。或将所有单词分成两个字母并在它们之间添加连字符。
    • 如果句号后面的东西是专有名词怎么办? "Then it happened.Winnie the Pooh looked up."
    • @SimonShine 我刚刚使用了 OP 认为正确的 OP 正则表达式。此答案仅提供替换部分。
    • @MartySmartyPants 奇怪。根据this answerthis cheat sheet 其中一个应该可以工作。然而,类似 TextMate 问题的 cmets 似乎表明不同版本的 TextMate 对捕获组的处理非常不同。您是否有可以更改的搜索替换对话框的设置,例如正则表达式样式?
    • @Socowi:您可以使用lookarounds 来避免在匹配期间之前和之后立即消耗字符。那么你也不需要反向引用。
    【解决方案3】:

    你可以这样试试

        var string = "Then it happened.first one foot.then the other."; 
        var result = string.replace(/[.]/g,'-');
    

    【讨论】:

    • "Then it happened-first one foot-then the other-" - 有两个错误。
    猜你喜欢
    • 2013-05-21
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多