排除字符串开头的文本

时间:2018-04-03 07:45:03

标签: regex regex-lookarounds regex-group

我是使用RegEx的新手,我仍然磕磕绊绊,所以如果这是一个基本问题,我很抱歉。我试图从两个括号中提取字符串,但我似乎无法弄清楚如何从匹配中排除第一部分。

这是我的正则表达式模式:

(.+?)(?= -)

我想提取出生日期,例如,排除" b。"和培训" - "。这是一个样本集:

( b. circa 1883 - d. Mar 03, 1960 )  
( b. May 21, 1887 - d. Jan 24, 1979 )  
( b. May 28, 1902 Zembin, BELARUS - d. Dec 22, 1998 Florida, USA )  
( b. Jan 09, 1886 Philadelphia, Pennsylvania, USA - d. May 17, 1969 New York, New York, USA )

我的正则表达式匹配( b. Jan 09, 1886 Philadelphia, Pennsylvania, USA(例如),但也包括"(b。"前缀,我想要排除。

正则表达式还匹配以下文本,我也想将其排除在外:

Husband of Sarah Wilder (August 2000

另外,我无法得到以下字符串,大概是因为圣路易斯的点和空格。

( b. Jun 28, 1920 St. Louis, Missouri, USA )

我已经敲了几个小时的脑袋,但是我不能完全掌握其余部分。任何帮助或指导将非常感谢。通过阅读这里的许多帖子,我已经获得了很多帮助。

非常感谢!

4 个答案:

答案 0 :(得分:0)

假设您的数据始终包含后跟d.的连字符,您可以尝试以下操作:(?<=b\. )(.*) - d\.

(?<=b\. )b.文字匹配,而不会将其添加到匹配的文字中。

(.*)是包含匹配项的捕获组。它捕获所有内容,直到终止- d.。请注意,.字符必须转义才能正确匹配,因为它们是正则表达式特殊字符。

答案 1 :(得分:0)

如果始终以( b.开头并以- d. <something> )结尾,则可以直接执行

(?<=^\( b\. ).*(?= - d\..*\))

这实际上意味着您匹配任何字符(.*),前面有<start of line>( b.(?<=^\( b\. )),后面跟- d. <something>)({{1 }})。 https://regex101.com/r/vB2fmP/1

或者,如果您不介意使用匹配组:

(?= - d\..*\))

并且捕获组1是您需要的值(我个人更喜欢这个值)。

答案 2 :(得分:0)

要防止捕获前导( b.,您可以在正则结尾前加\(\s*b\.\s*,该(b.\s*匹配,后面包含零个或多个空格字符{{1 }}

然后,从那时起,您可以在(.*?)组中捕获您的值,并且可以更新您的正面预测(?= (?:\-|\)))以包含带有-或{{1}的空白}。

\(\s*b\.\s*(.*?)(?= (?:\-|\)))

答案 3 :(得分:0)

您可以通过搜索字符串进行两次传递。在第一遍中,您捕获括号内的所有文本,在第二遍中,您通过删除不需要的表达式来清理结果。你不会说你正在使用什么语言,所以我会使用PHP。

$want = "/\(.+?\)/";
$dontWant = "/(b/.|/-)/";
$desiredResult = array();

$result = preg_match_all($want, $searchText, $matches);  // Get all text inside brackets

if (count($matches[0])>0) {  // $matches[0] holds all the matches
    foreach ($matches[0] as $match) { // Loop through the matches 
        $desiredResult[] = preg_replace( $dontWant, "", $match);  // Remove unwanted text
    }
}

您可以将其调整为您正在使用的任何语言。