【问题标题】:How to find the first occurrence of sub-strings not ended with specified characters如何查找不以指定字符结尾的子字符串的第一次出现
【发布时间】:2020-01-23 23:23:28
【问题描述】:

我将选择第一次出现的唯一字母字符串,该字符串不以任何字符 "."":"";" 结尾

例如:

"float a bbc 10" --> "float"
"float.h" --> null
"float:: namespace" --> "namesapace"
"float;" --> null

我想出了正则表达式\G([A-z]+)(?![:;\.]),但它只忽略了禁止字符之前的字符,而我需要它跳过禁止字符之前的所有字符串。

【问题讨论】:

  • 无论是第一次出现还是全部出现,都是用代码来完成的。您需要的正则表达式是(?<!\S)[A-Za-z]++(?![:;.])(?<!\S)[A-Za-z]+\b(?![:;.])。好吧,你也可以使用^.*?\K(?<!\S)[A-Za-z]++(?![:;.]) (PCRE) 或者在^.*?(?<!\S)([A-Za-z]+)\b(?![:;.]) 中获取Group 1
  • @WiktorStribiżew 是的,它可以工作,我正在使用 Perl,(?<!\S)[A-Za-z]++(?![:;.]) 工作得很好。谢谢,伙计!

标签: regex regex-negation


【解决方案1】:

你可以使用

/(?<!\S)[A-Za-z]++(?![:;.])/

请参阅regex demo。确保不要使用 g 修饰符来仅获取第一个匹配项。

这里的一个主要技巧是使用possessive ++ quantifier 来匹配所有连续的字母,并在最后一个匹配的字母之后只检查一次:;.

模式详情

  • (?&lt;!\S) - 空格或字符串开头应立即位于当前位置之前
  • [A-Za-z]++ - 1+ 个字母所有格匹配,不允许回溯到模式中
  • (?![:;.]) - 如果在当前位置的右侧紧邻有 ;:.,则匹配失败。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 2012-01-05
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多