正则表达式提取由' /'界定的文本

时间:2017-02-18 08:53:54

标签: regex gedcom

我需要一个正则表达式来从GEDCOM文件中提取名称。格式为:

弗雷德约瑟夫/史密斯/

以/为界的文字是姓氏而弗雷德约瑟夫是姓氏。复杂的是,姓氏可能在文本的任何地方,也可能根本不存在。我需要一些能够提取姓氏并将其他所有东西都作为名字捕获的东西。

这是我所拥有的,并且我已经尝试过将这些组选为?限定词,但无济于事:

What I have so far

正如你所看到的,它有几个问题:如果缺少姓氏没有被捕获,则名字有时会有前导和尾随空格,当我真的喜欢时,我有3个捕获组。更好的是,如果姓氏的捕获组没有包含' /'字符。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

对于你的最后一行,我不确定是否有办法将第3组加入第3组合并到一个组中。

这是我提出的解决方案。它并没有捕获名字周围的空间。

^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$

要正确匹配名称,请注意使用不敏感标记,如果您一次测试所有行,请使用多行标记。

See the demo

解释

  • ^行开头
  • (?:\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)

满足您的要求

([A-z a-z /])+\w*

Sample

答案 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]*)$

https://regex101.com/r/9kmKpy/2