从句子中选择一些字符串

时间:2015-12-16 07:29:56

标签: regex autoit

我是regex的新手,想要选择一些字符串遵循规则:

  

选择"美丽"(零或一)和" people00"或" peopleXXX"如果匹配的话。

句子:

  1. "我是美丽,迷人,友善的人民"
  2. "我是美丽,迷人,友善的人们XXX"
  3. "我是一个迷人友好的人民"
  4. "我是迷人友好的人们XXX"
  5. 现在我使用下面的规则来获取两个字符串

    (?i)(beautiful| ).*(people[a-zA-Z0-9]{2,3})
    

    还有其他方法可以选择吗?

    我尝试直接使用(beautiful)?.*(people[a-zA-Z0-9]{2,3}),但它不起作用。

1 个答案:

答案 0 :(得分:2)

你在正则表达式中有一个贪婪的点匹配子模式。此.*无法捕获漂亮的,因为它已与.*匹配。可选组(beautiful)?或强制组(beautiful| )只匹配任何内容(#1,组为#34;非参与")或第一个空格(#2)。为了避免这种情况,您需要限制以匹配漂亮以外的任何内容 peopleXXX

一种方法是使用tempered greedy token

(?i)(beautiful)?(?:(?!beautiful).)*(people[a-zA-Z0-9]{2,3})
                ^^^^^^^^^^^^^^^^^^^

请参阅demo

(?:(?!beautiful).)*将匹配任何符号,但换行符不会启动序列beautiful

另一种方法是使用这个缓和的贪婪标记的展开版本:

(?i)(beautiful)?[^b]*(?:b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})

请参阅another demo

[^b]*(?:b(?!eautiful)[^b]*)*匹配任何未启动beautiful字符序列的文本(它将匹配b以外的字符零次或多次([^b]*)然后任何数字b的序列未跟eautifulb(?!eautiful)),然后是b以外的零个或多个字符。

注意:要使此正则表达式更有效率,peopleXXX可以include a check

(?i)(beautiful)?(?:(?!beautiful|people[a-zA-Z0-9]).)*(people[a-zA-Z0-9]{2,3})

unrolled one

(?i)(beautiful)?[^bp]*(?:p(?!oeple[a-zA-Z0-9])[^p*]|b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})