Regex 用于提取以'/';
我需要一个正则表达式来从GEDCOM文件中提取名称。格式为: 弗雷德·约瑟夫/史密斯/ 其中,以/为界的文本为姓氏,弗雷德·约瑟夫为名。复杂的是,姓氏可能出现在文本中的任何地方,也可能根本不存在。我需要的东西,将提取姓氏,并捕捉所有其他的名字Regex 用于提取以'/';,regex,gedcom,Regex,Gedcom,我需要一个正则表达式来从GEDCOM文件中提取名称。格式为: 弗雷德·约瑟夫/史密斯/ 其中,以/为界的文本为姓氏,弗雷德·约瑟夫为名。复杂的是,姓氏可能出现在文本中的任何地方,也可能根本不存在。我需要的东西,将提取姓氏,并捕捉所有其他的名字 ^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$ 这是我所能做到的,我试着让组成为可选的?但没有用: 正如您所看到的,它有几个问题:如果姓氏缺失,则不会捕获任何内容,
^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$
这是我所能做到的,我试着让组成为可选的?但没有用:
正如您所看到的,它有几个问题:如果姓氏缺失,则不会捕获任何内容,名字有时会有前导空格和尾随空格,当我真正想要2个时,我有3个捕获组。如果姓氏的捕获组不包含“/”字符,则更好
任何帮助都将不胜感激。满足您的要求
([A-z a-z /])+\w*
我不确定我是否遵循了提取数据所使用的语言,但根据您目前掌握的情况,您只需添加“?”:
(.*)(\/?.*\/?)(.*)
这并不是说这不会为每个名称提供分组,因为某些解决方案在一个组中会有多个名称
编辑:
在Niitaku解决方案的基础上进行扩展,并考虑将每个单独的名称包含在自己的组中,您可以使用:
^\s*(?:\/?([a-z]+)\/?)\s*(?:\/?([a-z]+)\/?)\s*(?:\/?([a-z]+)\/?)\s*$
如前所述,如果使用ruby这样的语言,它将是:
ruby -pe '$_ = $_.scan(/\w+/)' file
希望这有帮助
(.\*?)\\/(.\*?)\\/(.\*)
对于您的最后一行,我不确定是否有方法将组1和组3加入到单个组中
这是我提出的解决方案。它不会捕获名字周围的空格
^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$
要正确匹配名称,请注意使用不敏感标志,如果一次测试所有行,请使用多行标志
解释
行的开头^
第一个匹配0或1次的非捕获组:(?:\h*([a-z\h]+\b)\h*)?
0个或更多水平空格\h*
捕获一组字母和空格,但在最后一个单词的末尾停止([a-z\h]+\b)
匹配可能剩余的空格而不捕获\h*
第二个非捕获组,与被斜杠包围的捕获组中的名称0或1次匹配(?:\/([a-z\h]+)\/)?
第三个非捕获组执行与第一个相同的操作,捕获第三个组中的名称(?:\h*([a-z\h]+\b)\h*)?
行尾$
^([^/]*)(/[^/]+/)?([^/]*)$
这与以下内容相匹配:
字符串的开头(或使用多行修改器行的开头)^
除([^/\n]*)
或新行零次或多次之外的任何内容-这被捕获为组1/
单个(/[^/\n]+/)?
后跟一个或多个非/
或新行字符,然后是单个“/”字符-这被捕获为组2,是可选的/
除([^/\n]*)
或新行零次或多次之外的任何内容-这被捕获为组3/
字符串结束(或使用多行修改器行结束)$
^([^\/\n]*)(?:\/([^\/\n]+)\/)([^\/\n]*)$
感谢您的快速回复。似乎对我不起作用。在/之前添加了\但仍然没有按预期捕获。感谢grail。当我这样做时,第一个捕获组捕获所有内容,包括Fred Joseph/Smith/。我使用的是NSRegularExpression,但测试时使用的是pcre味道。有一点让我感到困惑,需要的输出是什么?我们应该将“/”作为组的一部分捕获,还是只需要名称?只需要名称。理想情况下,第一个捕获组是“弗雷德·约瑟夫”,第二个捕获组是“史密斯”。HTM DaveYou或者需要考虑所有场景,如果只是使用正则表达式机器,但是如果使用一种语言(比如ruby),我可以很容易地提供所有名称,谢谢Niitaku。难怪我想不出来。我也很感激你的解释。谢谢。关于StackOverflow的一个很好的答案不仅仅包括一些代码。你可以通过解释发生了什么来改进你的答案,这样人们就可以从中学习。