我的模式匹配的最佳方法

时间:2014-03-12 12:08:21

标签: regex swift-mt

所以,我已经建立了一个正则表达式:

  

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:可选字母(例如: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!

2 个答案:

答案 0 :(得分:2)

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

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

所做的更改是:

  • 失去了背后的外观 - 只是让它成为比赛的一部分
  • 插入.?含义&#34;可选字符&#34;
  • ([a-zA-Z]{4}[a-zA-Z]{2}) ==&gt; [a-zA-Z]{6}(4 + 2 = 6)
  • [0-9] ==&gt; \d\d表示&#34;任何数字&#34;)
  • [X]{3} ==&gt; XXX(只是更容易阅读和更少字符)

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

答案 1 :(得分:0)

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

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

  • 代替[a-zA-Z] {4} [a-zA-Z] {2},你可以简单地使用[a-zA-Z] {6},并且围绕这个的分组括号可能是不必要的;
  • 可以省略{1}而不改变结果;
  • X不需要周围的括号。

总而言之 (?&LT; =:32 [^:]:)([A-ZA-Z] {6} [0-9] [A-ZA-Z] X {3}) 在相同的情况下更短,匹配。

如果您更好地描述域名,可能还需要进一步改进。