正则表达式提取以“/”为界的文本
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 标志.
说明
^
行首
(?:\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]*)$
我需要一个正则表达式来从 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 标志.
说明
^
行首(?:\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]*)$