【问题标题】:best approach for my pattern match我的模式匹配的最佳方法
【发布时间】:2014-04-16 13:27:09
【问题描述】:

所以,我构建了一个正则表达式,如下所示:

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!

【问题讨论】:

  • 不清楚你为什么在这里使用冒号和lookbehind。
  • 您的第二个字符串在冒号后有一个数字,但只允许使用字母。
  • 在输入 :32B:HsBfGB4LXXXHELLO 中找不到来自第一个输入 HSBCGB4LXXX 的匹配项。请更正您问题中的错字。
  • @Barmar 我试图迎合 H 之前的任何字符/数字
  • @anubhava,我正在处理我现有的模式,并试图适应它。也许这不是最好的方法,因此我发布了。

标签: regex swift-mt


【解决方案1】:

您的正则表达式可以简化并更正以允许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 组比赛包含你的目标

【讨论】:

  • 这包括H之前的字符
  • @CSharpNewBee 立即尝试 - 使用比赛的第 1 组
  • 粉碎,不使用Groups能做到吗?
  • 另外,如果我在 H 之前放置任何东西,那么它什么也不返回
  • 是的,但让我问一下,您已经对您的问题添加了一个编辑 - “32”是常数,还是可以是任何两位数?而且,这应该只在一行的开头匹配吗?另外,您使用什么工具/语言来执行您的正则表达式?最后,使用正则表达式,如果你应该有几个输入示例和预期目标是什么,以及一些不匹配输入的示例,它真的很有帮助。
【解决方案2】:

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

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

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

总之 (?

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

【讨论】:

  • 谢谢,您的编辑清除了分号之前的部分,但是对于 3 个结束字符是可选的,以及前两个字符是任意字母数字或数字后跟字母仍然存在一些混淆
  • 所以我现在能想到的是::\d\d\w?:([a-zA-Z]{6}[0-9][a-zA-Z] X{3})
  • 另外,与通常使用正则表达式一样,了解它不应该匹配的内容会很有帮助。根据整个域,可能会省略第二个分号之前的整个部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
相关资源
最近更新 更多