Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于提取以'/';_Regex_Gedcom - Fatal编程技术网

Regex 用于提取以'/';

Regex 用于提取以'/';,regex,gedcom,Regex,Gedcom,我需要一个正则表达式来从GEDCOM文件中提取名称。格式为: 弗雷德·约瑟夫/史密斯/ 其中,以/为界的文本为姓氏,弗雷德·约瑟夫为名。复杂的是,姓氏可能出现在文本中的任何地方,也可能根本不存在。我需要的东西,将提取姓氏,并捕捉所有其他的名字 ^(?:\h*([a-z\h]+\b)\h*)?(?:\/([a-z\h]+)\/)?(?:\h*([a-z\h]+\b)\h*)?$ 这是我所能做到的,我试着让组成为可选的?但没有用: 正如您所看到的,它有几个问题:如果姓氏缺失,则不会捕获任何内容,

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

弗雷德·约瑟夫/史密斯/

其中,以/为界的文本为姓氏,弗雷德·约瑟夫为名。复杂的是,姓氏可能出现在文本中的任何地方,也可能根本不存在。我需要的东西,将提取姓氏,并捕捉所有其他的名字

^(?:\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*)?$
要正确匹配名称,请注意使用不敏感标志,如果一次测试所有行,请使用多行标志

解释
  • ^
    行的开头
  • (?:\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*)?
    第三个非捕获组执行与第一个相同的操作,捕获第三个组中的名称
  • $
    行尾
试试这个:
^([^/]*)(/[^/]+/)?([^/]*)$

这与以下内容相匹配:

  • ^
    字符串的开头(或使用多行修改器行的开头)
  • ([^/\n]*)
    /
    或新行零次或多次之外的任何内容-这被捕获为组1
    • (/[^/\n]+/)?
      单个
      /
      后跟一个或多个非
      /
      或新行字符,然后是单个“/”字符-这被捕获为组2,是可选的
    • ([^/\n]*)
      /
      或新行零次或多次之外的任何内容-这被捕获为组3
    • $
      字符串结束(或使用多行修改器行结束)
您可以在此处看到示例文本的实际操作:

要不捕获斜杠,可以通过将?:添加到第二组括号中,然后在斜杠之间添加另一对来添加非捕获组:
^([^\/\n]*)(?:\/([^\/\n]+)\/)([^\/\n]*)$


感谢您的快速回复。似乎对我不起作用。在/之前添加了\但仍然没有按预期捕获。感谢grail。当我这样做时,第一个捕获组捕获所有内容,包括Fred Joseph/Smith/。我使用的是NSRegularExpression,但测试时使用的是pcre味道。有一点让我感到困惑,需要的输出是什么?我们应该将“/”作为组的一部分捕获,还是只需要名称?只需要名称。理想情况下,第一个捕获组是“弗雷德·约瑟夫”,第二个捕获组是“史密斯”。HTM DaveYou或者需要考虑所有场景,如果只是使用正则表达式机器,但是如果使用一种语言(比如ruby),我可以很容易地提供所有名称,谢谢Niitaku。难怪我想不出来。我也很感激你的解释。谢谢。关于StackOverflow的一个很好的答案不仅仅包括一些代码。你可以通过解释发生了什么来改进你的答案,这样人们就可以从中学习。