【问题标题】:regex : match dot with no space after正则表达式:匹配点后没有空格
【发布时间】:2020-02-19 14:06:47
【问题描述】:

我想在字符串中搜索除 /、#、$ 和后面没有空格的点以外的所有标点符号(例如 .net)

到目前为止,我已经这样做了。

?!['\/#$])\p{P}

现在我需要处理后面没有空格的点。

如果有人有想法...

我正在使用 Java。
例如,我需要用“”(空字符)替换所有标点符号,除了后面没有空格的点:

.net,asp.net 你好。世界,c#

变成

.net asp.net hello world c#

【问题讨论】:

  • 请提供示例输入并标记适当的编程语言(如果有)。
  • 用示例编辑过的帖子
  • 好吧,仅凭这个例子很难说清楚。但是由于点是一个特殊字符,您将 a) 需要使用反斜杠将它们转义并 b) 检查以下字符,可能带有否定的前瞻。所以像:\.(?!\S) 只适用于点。
  • 谢谢;您是否有一个适用于该示例的正则表达式:.net,asp.net hello。 world, c# -> .net asp.net hello world c#
  • 这个正则表达式 ?!['\/#$])\p{P} 匹配除 / # $ 之外的所有标点符号。现在我想添加一个例外:每个点后面都有一个字母或数字。

标签: regex


【解决方案1】:

您可以在否定前瞻中添加替代方案:

(?![/#$]|\.(?!\s))\p{P}
        ^^^^^^^^^

请参阅regex demo。

详情

  • (?![/#$]|\.(?!\s)) - 如果紧靠右侧,则匹配失败,有 /、# 或 $,或 . 后面没有空格字符
  • \p{P} - 任何适当的标点符号

【讨论】:

    【解决方案2】:

    这个正则表达式似乎满足您的用例:

    (?!\.\w)(?!['\/#$])\p{P}
    

    您可能需要进行更改(例如更改\p{P})才能在Java 中使用,请参阅Regular Expressions on Punctuation

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

    【讨论】:

    • 请注意,\w 除了[a-zA-Z0-9] 之外还包括_,因此这与._ 中的. 不匹配。
    【解决方案3】:

    我会使用以下内容:

    [\]!"%&'()*+,:;<=>?@[\\^_`{|}~-]|\.(?![a-zA-Z0-9])
    

    字符类[!"%&amp;'()*+,:;&lt;=&gt;?@[\]^_`{|}~-] 匹配除/、#、$ 和. 之外的\p{P} 的任何符号,而其他替代项匹配一个不跟随字母或数字的点.

    请注意,使用\b 很诱人,但这是一个坏主意,因为\w 除了[a-zA-Z0-9] 之外还包括_。

    如果你想继续使用\p{P},你可以使用以下,但期望性能会降低:

    (?![/#$]|\.[a-zA-Z0-9])\p{P}
    

    以下内容也可以使用,并且可能与我的第一个答案一样有效,但它基于鲜为人知的语法,如果我没记错的话,它是特定于 Java 正则表达式的:

    [\p{P}&&[^/#$.]]|\.(?![a-zA-Z0-9])
    

    【讨论】:

    • 谢谢,你所有的答案都有效,现在很难知道该选择哪个:)
    • 我个人会避免使用第二个,因为它效率低下(甚至在查看它是否是“标点符号”之前测试输入字符串的每个字符的前瞻的两种选择),第三个是因为它使用了一个晦涩难懂的特性,这肯定会让未来的维护者摸不着头脑。第一个不是很漂亮,但它是基本的并且可以工作
    • 此外,它还避免使用我个人认为命名无益的“标点符号”类:我希望它匹配本地化的标点符号,例如 ¿ 和 ¡,但它不匹配,并且我从未听说过 # = 或 &gt; 在此类定义之外被称为标点符号。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2019-10-02
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多