【发布时间】:2015-04-23 06:24:23
【问题描述】:
我有一个长字符串,例如“sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f”,我必须从该字符串中提取“AP09BN7886”,这实际上是印度的车辆车牌号。我知道可能最简单的方法是使用正则表达式,任何人都可以告诉我 reg. exp 来找到这个。
【问题讨论】:
-
与其他文本相比,什么定义了许可证号?所有可能的格式是什么?
我有一个长字符串,例如“sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f”,我必须从该字符串中提取“AP09BN7886”,这实际上是印度的车辆车牌号。我知道可能最简单的方法是使用正则表达式,任何人都可以告诉我 reg. exp 来找到这个。
【问题讨论】:
据我了解,您只需要删除小写字母和空格即可。可能最有效的解决方案不是使用正则表达式,而是使用以下代码:
s = 'sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f';
s(s~=upper(s) | s==32) = [];
最好的,
【讨论】:
据我了解the format,印度车牌是:
[A-Z]{2}
\d{2}
[A-Z]*\d{4}
(数字 1 和数字 2 组合为州和地区的RTO)
您试图从一个长字符串中收集其中的组成部分,并且您没有对字符串的其他部分进行足够的详细说明以完全消除歧义(例如:字母都是小写或非拉丁字符?仅每个字符串一个车牌?四个数字前只有两个字母?等等)由于这未知,你可以用.*?表示匹配组之间的字符“海”@
4 位数字之前的可变字母特别不明确,因为字符串中可能存在不相关的大写拉丁字母。
您可以使用以下正则表达式查找 示例,但我不会说会在所有字符串中找到每个组合:
([A-Z]{2}).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})
然后合并四个捕获组。
如果您想更具体,请根据印度各州的两个字母代码对前两个字母进行更改。
例如:
(AS|NL|MH etc).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})
或者,通过RTO使用更全面的匹配
如果您可以进一步细化捕获组之间的“其他”,您可以使用带有 .* 的 negative character class 或 an anchor 更准确:
# pseudo regex...
# XXX is (match or skip or anchor the in between stuff...)
(AS|NL|MH etc)XXX(\d{2})XXX([A-Z]*)XXX(\d{4})
然后你需要考虑一些例外情况(特殊的德里地区代码、外交车牌、虚荣车牌、军事车牌、哦男孩……)
【讨论】:
([A-Z]*) 表示,这使得消除周围的文本变得困难。实际上,您可能会考虑将([A-Z]+) 用于一个或多个或([A-Z]{2,}) 用于两个或多个,并且知道在每个 RTO 中有 9,999 辆没有字母前缀的早期汽车您不会匹配。 ;-)
Matlab 中的工作示例:
str = ['sdnak hsd fds 57 fnsdf APsdf09sdf BN fddsdalf 7886sd f'];
expression = '([A-Z]{2}).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})'
tokens = regexp(str,expression,'tokens')
result = cell2mat(tokens{1})
-----------------------------------------------------------------
result = AP09BN7886
【讨论】: