正则表达式匹配特定长度的字符串,中间有空格(任何地方)
Posted
技术标签:
【中文标题】正则表达式匹配特定长度的字符串,中间有空格(任何地方)【英文标题】:Regex to match specific-length string with white space in the middle (anywhere) 【发布时间】:2016-07-29 20:47:30 【问题描述】:我需要一个匹配短语(具有特定长度和结构)的正则表达式,即使中间(任何地方)有额外的空格。
假设我们有一些描述:
Serial numbers: ABC1234567890 XYZ0987654321
然后我们要查找与正则表达式 [A-Z]3[0-9]10
匹配的所有短语,但是由于外部服务的处理,该描述格式不正确。该服务将描述分成块,每块 12 位。所以它会是:
Serial numbe
rs: ABC12345
67890 XYZ098
7654321
重要提示:“序列号:”不是固定的,它可以是所有内容,因此可以在任何地方拆分所需的短语(ABC1 234567890
、ABC1234567 890
等)。从短语匹配的角度来看,换行和空格具有相同的含义,但在特殊情况下,短语的各个部分之间可以有更多的白色字符(例如,空格作为块的最后一个字符+换行,源描述中的多个空格)。它只是应该将两个字符串之间的整个“空白”视为 1 个空格(ABC1 234567890
= ABC1234 567890
,也带有换行符)。这些序列号可以是格式错误的描述中的任何地方(正如我所写:“序列号:”部分是可选的,可以是任何东西),描述中也可以有更多序列号。 [A-Z]3[0-9]10
也只是一个例子,我想知道如何实现中间可选空格的匹配,但是基本正则表达式可以不同。
预期结果:匹配短语的集合(示例中的序列号)。
ABC1234567890
XYZ0987654321
信息:结果可以在短语中包含白色字符(在上面的示例中为:ABC12345 67890
和 XYZ098 7654321
)。最重要的是匹配基本短语(序列号)。
是否可以制作匹配它的正则表达式?我认为在没有正则表达式的情况下匹配它会是相当简单的算法,但也许可以用正则表达式完成并使其成为“oneliner”。
【问题讨论】:
换行符和空格有什么不同的含义? @karakfa 我已经编辑了“重要”段落。 标题仍然显示一个空格!空格可以出现在任何地方和任何数量,但只能出现一次吗?或多次,例如AB C 12 34
我已经编辑了摘要(标题)。我认为一个短语只能拆分一次,因此中间只能出现一个空格,但可以是多个白色字符。
【参考方案1】:
这将多次处理多个空格
(([A-Z]\s*)3([0-9]\s*)10)
将匹配AB C A A A A AD E12 34567890
因为AD E12 34567890
符合模式
https://regex101.com/r/bK3sF8/1
【讨论】:
不幸的是,它也匹配AB C A A A A AD E12 34567890
之类的东西。我尝试过类似的东西,但 ([A-Z\s])3,
匹配整个捕获组多次而不是组内允许的字符。
编辑后看起来效果很好!稍后我会再做一些测试,因为我的笔记本电脑没电了。
当我们实现这个时,我会做更多的测试,我们的问题仍然是开放的,等待更重要的完成。敬请期待。【参考方案2】:
编辑:
只考虑一个(你可以调整为倍数)\n
(换行)这里的字内外:([\w\n?]*)
您应该尝试对结果进行分组
在这种情况下:
/(([\w\n?]*)\s([\w\n?]*):\s([\w\n?]*)\n?\n?\s([\w\n]*))/ig
您可以通过 $3 和 $4 组获取序列号
http://regexr.com/3d67n
【讨论】:
据我了解您的正则表达式,它为我的示例量身定制,但这些序列号可以在任何地方(正如我所写:“序列号:”部分是可选的,可以是任何东西),描述中还可以有更多的序列号。另外[A-Z]3[0-9]10
也只是示例,我想知道如何实现与中间可选空格的匹配,但基本正则表达式可以不同。以上是关于正则表达式匹配特定长度的字符串,中间有空格(任何地方)的主要内容,如果未能解决你的问题,请参考以下文章