我是使用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 )
我已经敲了几个小时的脑袋,但是我不能完全掌握其余部分。任何帮助或指导将非常感谢。通过阅读这里的许多帖子,我已经获得了很多帮助。
非常感谢!
答案 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}的空白}。
答案 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
}
}
您可以将其调整为您正在使用的任何语言。