我需要一个正则表达式来从GEDCOM文件中提取名称。格式为:
弗雷德约瑟夫/史密斯/以/为界的文字是姓氏而弗雷德约瑟夫是姓氏。复杂的是,姓氏可能在文本的任何地方,也可能根本不存在。我需要一些能够提取姓氏并将其他所有东西都作为名字捕获的东西。
这是我所拥有的,并且我已经尝试过将这些组选为?限定词,但无济于事:
正如你所看到的,它有几个问题:如果缺少姓氏没有被捕获,则名字有时会有前导和尾随空格,当我真的喜欢时,我有3个捕获组。更好的是,如果姓氏的捕获组没有包含' /'字符。
非常感谢任何帮助。
答案 0 :(得分:3)
对于你的最后一行,我不确定是否有办法将第3组加入第3组合并到一个组中。
这是我提出的解决方案。它并没有捕获名字周围的空间。
^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$
要正确匹配名称,请注意使用不敏感标记,如果您一次测试所有行,请使用多行标记。
^
行开头(?:\h*([a-z\h]+\b)\h*)?
第一个匹配0或1次的非捕获组:
\h*
0个或更多水平空格([a-z\h]+\b)
以小组字母和空格捕获,但在最后一个单词的末尾停止\h*
匹配可能的剩余空格而不捕获(?:\/([a-z\h]+)\/)?
第二个非捕获组,匹配0或1次在斜杠包围的捕获组中的名称(?:\h*([a-z\h]+\b)\h*)?
第三个非捕获组与第一个捕获组相同,捕获第三组中的名称。$
行尾答案 1 :(得分:0)
答案 2 :(得分:0)
我不确定我会使用哪种语言来提取数据,但根据您目前的情况,您只需要添加'?':
["tuples": 5, "awesome": 1, "are": 2, "cool": 1, "shades": 1]
并非这不会为您提供EACH名称的分组,因为某些解决方案在一个组中会有多个名称
编辑:
扩展Niitaku解决方案,并考虑在自己的组中使用每个名称,您可以使用:
(.*)(\/?.*\/?)(.*)
如上所述,如果使用像ruby这样的语言,它只会是:
^\s*(?:\/?([a-z]+)\/?)\s*(?:\/?([a-z]+)\/?)\s*(?:\/?([a-z]+)\/?)\s*$
答案 3 :(得分:0)
希望这会有所帮助
(.\*?)\\/(.\*?)\\/(.\*)
答案 4 :(得分:0)
试试这个:^([^/]*)(/[^/]+/)?([^/]*)$
符合以下条件:
^
字符串的开头(或使用多行修改符的行首)([^/\n]*)
除/
以外的任何内容或新行0或更多次 - 这被捕获为第1组
(/[^/\n]+/)?
一个/
后跟一个或多个非/
或新行字符,然后是一个'/'字符 - 这被捕获为第2组,并且是可选的< / LI>
([^/\n]*)
/
以外的任何内容或新行零次或更多次 - 这被捕获为第3组$
字符串结尾(或使用多行修饰符行尾)您可以在此处查看示例文字:https://regex101.com/r/9kmKpy/1
要捕获斜杠,可以通过将?:添加到第二组括号中,然后在斜杠之间添加另一对来添加非捕获组:
^([^\/\n]*)(?:\/([^\/\n]+)\/)?([^\/\n]*)$