正则表达式捕获组排除了可选子字符串?

时间:2017-02-23 12:59:14

标签: regex data-extraction

我试图构建一个正则表达式来从数据中提取瑞典组织编号。这些数字可以是以下格式:

999999999999  // 12 digits, first two should be ignored.
9999999999    // 10 digits, all should be included.
99999999-9999 // 12 digits with a dash, first two digits and the dash should be ignored
999999-9999   // 10 digits with a dash, dash should be ignored.

对于12位数字的情况,前两位数字总是16,19或20.我目前的尝试是:

(?:16|19|20)?(\d{6}\-?\d{4})

这将返回$1中的十位数组织编号,但如果存在,则会包含短划线。我希望删除破折号(或者如果缺少破折号可能会添加破折号),以便$1具有相同的格式,无论输入中是破折号还是没有破折号。

正则表达式在一个配置中,将用在简单提取$1的代码中,所以我无法在代码中解决这个问题 - 我需要正则表达式来实现它自己" 34。

作为最后的手段,我可​​以修改代码以允许config指定"替换字符串"除了搜索正则表达式之外,还有代码使用replace的结果作为提取的最终结果。在那种情况下,我可以使用它:

Regex: (?:16|19|20)?(\d{6})\-?(\d{4})
Replace string: $1$2

但是这会导致其他问题,因为对于其他配置项,正则表达式将返回多个"数据字段",每个捕获组一个。为了实现这一点,在这种情况下,我需要提供替换字符串的序列,例如对于标签分隔格式,中间有组织编号:

Regex: ([^\t]*)\t(?:16|19|20)?(\d{6})\-?(\d{4})\t([\d]*)
Replace string 1: $1 (free text field)
Replace string 2: $2-$3 (the organization number with dash "enforced")
Replace string 3: $4 (numeric field)

可行,但相当尴尬......那么,在搜索正则表达式中解决它的方法是什么?

0 个答案:

没有答案
相关问题