【问题标题】:Pattern for apostrophe inside quotes引号内的撇号模式
【发布时间】:2016-07-20 21:03:27
【问题描述】:

我正在寻找一种可以找到单引号内的撇号的模式。例如文字

Foo '不能' bar '不要'

我想查找并替换 can't 和 don't 中的撇号,但我不想查找单引号

我尝试过类似的东西

(.*)'(.*)'(.*)'

并在第二个匹配组上应用替换。但是对于包含 2 个带有撇号的单词的文本,这种模式将不起作用。

编辑:澄清文本可以有单引号,其中没有撇号,应按原样保留。例如

'foo' '不能' bar '不要'

我仍然只寻找撇号,所以 foo 周围的单引号不应该匹配

【问题讨论】:

标签: regex


【解决方案1】:

我相信您需要要求“单词”字符出现在' 符号之前和之后,并且可以通过单词边界来完成:

\b'\b

regex demo

要只匹配 字母 中的引号,请使用

(?<=\p{L})'(?=\p{L})
(?<=[[:alpha:]])'(?=[[:alpha:]])
(?U)(?<=\p{Alpha})'(?=\p{Alpha})  # Java, double the backslashes in the string literal

或仅 ASCII

(?<=[a-zA-Z])'(?=[a-zA-Z])

【讨论】:

    【解决方案2】:

    您可以使用以下正则表达式:

    '[^']+'\s|'[^']+(')[^' ]+'
    

    它会返回3个匹配,如果捕获组1参与了单词,它将是单词中的撇号:

    • '富'
    • 'can't'
    • 'don't'

    demo

    它是如何工作的:

    • '[^']+'\s
      • ' 匹配撇号
      • [^']+ 后跟至少一个不是撇号的字符
      • ' 后跟一个撇号
      • \s 后跟一个空格
    • |
    • '[^']+(')[^' ]+'
      • ' 匹配撇号
      • [^']+ 后跟至少一个不是撇号的字符
      • (') 后跟一个撇号,并在捕获组 1 中捕获它
      • [^' ]+ 后跟至少一个不是撇号或空格的字符
      • ' 后跟一个撇号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2018-11-15
      • 2018-09-21
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多