【问题标题】:Excluding text at the beginning of a string排除字符串开头的文本
【发布时间】:2018-09-12 11:16:50
【问题描述】:

我是使用 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 )

我已经敲了好几个小时的头,但就是无法完全理解其余部分。任何帮助或指导将不胜感激。通过阅读这里的许多帖子,我已经得到了很多帮助。

非常感谢!

【问题讨论】:

    标签: regex regex-lookarounds regex-group


    【解决方案1】:

    您可以通过搜索字符串进行两次传递。在第一遍中,您捕获括号内的所有文本,在第二遍中,您通过删除不需要的表达式来清理结果。你不说你用的是什么语言,那我就用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
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      为防止捕获前导 ( b.,您可以在正则表达式前面加上 \(\s*b\.\s*,这将匹配由零个或多个空格字符 \s* 包围的 (b.

      然后从那时起,您将在 (.*?) 组中捕获您的值,并且您可以更新您的正向前瞻 (?= (?:\-|\))) 以包含带有 -) 的空格。

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

      【讨论】:

        【解决方案3】:

        如果它总是以( b. 开头并以- d. <something> ) 结尾,你可以这样做

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

        这实际上意味着您匹配任何字符 (.*),前面是 &lt;start of line&gt;( b. ((?&lt;=^\( b\. )),后面是 - d. &lt;something&gt;) ((?= - d\..*\)))。 https://regex101.com/r/vB2fmP/1

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

        ^\( b\. (.*) - d \..*\)$
        
        ^                         start of line
         \( b\.                   open parenthesis, space, b, dot, space
                (  )              capture group
                 .*               any char, any occurence
                     - d \..*\)   space, hyphen, space, d, dot, 
                                     then any char any occurrence, 
                                     close parenthesis,
                               $  end of line
        

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

        【讨论】:

          【解决方案4】:

          假设您的数据始终包含一个连字符后跟d.,您可以试试这个:(?&lt;=b\. )(.*) - d\.

          (?&lt;=b\. ) 匹配 b. 文本,但不会添加到匹配文本中。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-25
            • 1970-01-01
            • 2015-01-28
            • 1970-01-01
            • 1970-01-01
            • 2019-11-15
            相关资源
            最近更新 更多