我有一个很长的字符串,如#34; sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f"从这个字符串我必须提取" AP09BN7886"这实际上是印度车辆的车牌号码。我知道可能最简单的是使用正则表达式,任何人都可以告诉我reg。 exp找到这个。
答案 0 :(得分:5)
据我了解,您只需删除小写字母和空格即可。可能最有效的解决方案不会使用正则表达式,而是使用以下代码:
s = 'sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f';
s(s~=upper(s) | s==32) = [];
最佳,
答案 1 :(得分:3)
据我了解the format,印度车牌是:
[A-Z]{2}
\d{2}
[A-Z]*\d{4}
(1号和2号组合是州和区的RTO
您正在尝试从长字符串中收集该组件,并且您没有详细说明该字符串的其他部分以完全消除歧义(例如:字母都是小写字母或非拉丁字符?仅每个字符串一个牌照?只有两个字母前面加上四个数字?等等)由于这是未知的,你可以用.*?
4位数字之前的变量字母特别模糊,因为字符串中可能存在不相关的大写拉丁字母。
您可以使用以下正则表达式找到示例,但我不会说会找到所有字符串中的每个commbo:
([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})
然后你需要考虑例外情况(特别德里地区代码,外交牌照,虚荣牌,军事板块,男孩......)
答案 2 :(得分:2)
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