0

因此,我构建了一个正则表达式,它遵循以下内容:

4!a2!a2!c[3!c]

这被翻译成

  • 4 个字母字符后跟
  • 2 个字母字符后跟
  • 2 个字符后跟
  • 3 可选字符

这是 SWIFT BIC 代码 HSBCGB2LXXX 的标准格式

我将其从字符串中提取出来的正则表达式是:

(?<=:32[^:]:)(([a-zA-Z]{4}[a-zA-Z]{2})[0-9][a-zA-Z]{1}[X]{3})

现在这是针对特定标签(32)并且有效,但是,我不确定它是否是最干净的,而且如果在 H 之前有任何字符,那么它会失败。

匹配的字符串是:

:32B:HsBfGB4LXXXHELLO

以下返回HSBCGB4LXXX,但这:

:32B:2HsBfGB4LXXXHELLO

什么都不返回。

编辑

为了清楚起见。我有一个包含多行的字符串,所有行都以:2xnumber:optional 字母开头(例如:58A:) 我想指定一行开始匹配并从该行的任何位置返回一个BIC。

编辑 更多示例数据以提供帮助:

:20:ABCDERF  Z
:23B:CRED
:32A:140310AUD2120,
:33B:AUD2120,
:50K:/111222333                        
Mr Bank of Dad              
Dads house
England            
:52D:/DBEL02010987654321
address 1 
address 2
:53B:/HSBCGB2LXXX
:57A://AU124040
AREFERENCE
:59:/44556677
A line which HSBCGB2LXXX contains a BIC
:70:Another line of data
:71A:Even more

好的,所以我需要将标签 53 或 59 作为变量传递并仅返回 BIC HSBCGB2LXXX!

4

2 回答 2

2

您的正则表达式可以简化和更正以允许 , 之前的字符H

:32[^:]:.?([a-zA-Z]{6}\d[a-zA-Z]XXX)

所做的更改是:

  • 失去了背后的目光 - 只是让它成为比赛的一部分
  • 插入.?含义“可选字符”
  • ([a-zA-Z]{4}[a-zA-Z]{2})==> [a-zA-Z]{6}(4+2=6)
  • [0-9]==> \d\d意思是“任何数字”)
  • [X]{3}==> XXX(只是更容易阅读和更少的字符)

比赛的第 1 组包含您的目标

于 2014-03-12T12:19:35.047 回答
0

我不太确定我是否完全理解您的问题,因为您的正则表达式与您上面描述的不完全匹配。例如,您提到了 3 个可选字符,但在正则表达式中您使用了 3 个强制 X-es。

但是,可以进一步清理实际的正则表达式:

  • 而不是 [a-zA-Z]{4}[a-zA-Z]{2},您可以简单地使用 [a-zA-Z]{6},并且围绕它的分组括号可能是不必要的;
  • {1} 可以省略,结果不会发生任何变化;
  • X 不需要周围的括号。

总而言之 (?<=:32[^:]:)([a-zA-Z]{6}[0-9][a-zA-Z]X{3}) 更短并且非常匹配相同的情况。

如果您对域进行更好的描述,则可能还可以进行进一步的改进。

于 2014-03-12T12:24:52.150 回答