在两个其他字符串后面找到一个字符串

时间:2015-07-10 15:50:11

标签: regex

让我们举个例子:

" Blablabla。我的名字是约翰,我21岁。 Blablabla"

其他例子:

" Blablabla。我的名字是约翰,我21岁。 - 嗨,我玛丽和我22岁。"

基本上,我想匹配第一个人的年龄(这里,21,可能是23或其他)。我的想法是,我知道我会以&#34开头的句子;我的名字是$ name,我是21"但我无法知道什么是$ name。 总的想法是在&#34之后选择一个数字;我的名字是" +东西+"我和#34;。

如果知道我不能使用捕获组,人们如何使用正则表达式做到这一点?

到目前为止我所拥有的:

    (?<=<My name is )(.*)(?= years old)

理想情况下,我想要这样的工作:

    (?<=<My name is .* and I'm )(.*)(?= years old)

......但事实并非如此! 。*显然不能处于一个前瞻性的群体中(这是有道理的)。

谢天谢地。

2 个答案:

答案 0 :(得分:1)

TextBlock

现在第一个匹配的组是名称,第二个匹配的组是年龄。

<小时/> 如果由于某种原因您不想使用群组,则可以匹配:

/My name is (\w+) and I'm (\d+) years old./

的名称和:

/(?<=My name is )\w+(?= and I'm )/

适合年龄。

<小时/> 正如您所注意到的那样,不允许使用具有可变长度的lookbehinds(至少在我所知道的正则表达式引擎中,并非逻辑上不可能)。但是,您可以使用/(?<= and I'm )\d+(?= years old.)/ 替代:

\K

答案 1 :(得分:0)

@ndn的答案基本上是正确的,但我认为需要进行一些修改:

  1. \w+表达式找不到空格,例如&#34;我的名字是玛丽凯特,而我今年47岁。&#34;
  2. 如果我正确地解释了您的请求,您只需要匹配的日期,那么我就不会认为您和@ndn已设置的后视和外观断言是必要的。
  3. 我相信这个正则表达式会给你你想要的东西:
    My name is .+? and I'm (\d+) years old\.

    (注意最后的\.所以它将匹配文字句点,而不是任何字符。)

    请参阅https://regex101.com/r/nJ7wS5/1

    上的示例