正则表达式提取以“/”为界的文本

Regular Expression to Extract Text Bounded by '/'

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

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

/ 包围的文本是姓氏,Fred Joseph 是名字。复杂的是,姓氏可能出现在文本中的任何地方,也可能根本不存在。我需要一些东西来提取姓氏并将其他所有内容捕获为名字。

这是我所知道的,我已经尝试使用 ?预选赛但无济于事:

如您所见,它有几个问题:如果缺少姓氏,则不会捕获任何内容,名字有时会有前导和尾随空格,我有 3 个捕获组,而我真的想要 2 个。甚至如果姓氏的捕获组不包含“/”字符会更好。

如有任何帮助,我们将不胜感激。

根据您的要求

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

Sample

我不确定我遵循的是哪种语言来提取数据,但根据您目前的情况,您只需添加“?”:

(.*)(\/?.*\/?)(.*)

并不是说这不会为您提供每个名称的分组,因为某些解决方案将在一个组中有多个名称

编辑:

扩展 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*)?$

要正确匹配名称,注意使用 insensitive 标志,如果一次测试所有行,请使用 multiline 标志.

See the demo

说明

  • ^ 行首
  • (?:\h*([a-z\h]+\b)\h*)?第一个non-capturing组匹配0次或1次:
    • \h* 0 个或更多水平空格
    • ([a-z\h]+\b) 捕获一组字母和空格,但停在最后一个单词的末尾
    • \h*匹配可能的剩余空格而不捕获
  • (?:\/([a-z\h]+)\/)? 第二个 non-capturing 匹配捕获组中被斜杠包围的名称 0 次或 1 次的组
  • (?:\h*([a-z\h]+\b)\h*)? 第三组 non-capturing 与第一组相同,捕获第三组中的名称。
  • $行尾

试试这个:^([^/]*)(/[^/]+/)?([^/]*)$

这与以下匹配:

  • ^ 字符串开头(或带有多行修饰符的行开头)
  • ([^/\n]*)/ 以外的任何内容或换行零次或多次 - 这被捕获为第 1 组
    • (/[^/\n]+/)? 单个 / 后跟一个或多个非 / 或换行符,然后是单个 '/' 字符 - 这被捕获为第 2 组,并且是可选
    • ([^/\n]*)/ 以外的任何内容或换行零次或多次 - 这被捕获为第 3 组
    • $ 字符串结尾(或带有多行修饰符的行结尾)

您可以在此处查看示例文本的实际效果:https://regex101.com/r/9kmKpy/1

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

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