正则表达式在指定值处停止

Regular Expression Stopping at Specified Value

我必须使用正则表达式来解析 swift 消息中的值,并且在某些情况下行为不是我想要的。

假设我正在寻找具有特定模式的东西 - 在这种情况下是 BIC(6 个字母,后跟 2 个字母或数字,后跟可选的 XXX 或 3 个数字)

([A-Z]{6}[A-Z0-9]{2}[XXX0-9]{0,3})

很好,但现在我想在特定字段中查找这些银行代码。在 swift 中,一个字段用 : 表示并且有一些数字,有时还有一个字母。

所以我想匹配字段 52A

中的 BIC 值

我可以做到以下几点

(52A:[A-Z]{6}[A-Z0-9]{2}[XXX0-9]{0,3})

这将匹配 52A:AAAAAAAAXXX

我的问题是你可以在这个值之前和之后有东西 - 而这个值本身可能不存在于你想要的字段中

所以我可以通配符 reg ex 以允许它前面的东西,例如

(52A:.*?[A-Z]{6}[A-Z0-9]{2}[XXX0-9]{0,3})

匹配 52A:somerubbishAAAAAAAAXXX

但如果此字段中没有任何内容 - reg ex 继续搜索模式,这就是我遇到问题的地方。

例如上面的 reg ex 匹配这个 52A:somerubbish:57D:AAAAAAAAXXX

问题

我需要 reg ex 停在它后面的第一个字段上(它可能并不总是 57D 但它总是遵循格式 [0-9]{2}[A-Z]{0,1}) 所以上面的例子不应该 return 匹配,因为 52A 部分

中不包含我之后的模式

有人知道我该怎么做吗?

.*?改为[^:]*?:

(52A:[^:]*?[A-Z]{6}[A-Z0-9]{2}[XXX0-9]{0,3})

[^:] 表示“除 : 之外的任何字符”,这确保匹配不会 运行 进入下一个字段。

live demo

此外,除非您的情况要求您将目标匹配为第 1 组,否则您不需要外括号:整个匹配项(即第 0 组)将是您的目标。


我怀疑你想要 (XXX|\d{3})?(XXX 或 3 位数字,但可选)或者 (XXX|\d{1,3})?(XXX 或最多 3 位数字,但可选)

使用[XXX0-9]{0,3}(与[X0-9]{0,3}相同)是字符class表示法,重复0-3次X字符或数字。

如果值本身也可以包含冒号,则可以将任何字符匹配为“垃圾”,只要紧靠右边的不是字段格式即可。

52A:(?:(?![0-9]{2}[A-Z]?:).)*[A-Z]{6}[A-Z0-9]{2}(?:[0-9]{3}|XXX)?

模式匹配:

  • 52A:字面匹配
  • (?:(?![0-9]{2}[A-Z]?:).)* 匹配任何断言不是 2 位数字的字符,可选字符 A-Z 和 : 直接向右
  • [A-Z]{6}[A-Z0-9]{2} 匹配 6 个字符 A-Z 和 2 个字符 A-Z 或 0-9
  • (?:[0-9]{3}|XXX)? 可选择匹配 3 位数字或 XXX

看到一个regex demo.