regexp用于在长串中找到matlab中的子串(车号牌)?

时间:2015-04-22 16:57:23

标签: regex matlab

我有一个很长的字符串,如#34; sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f"从这个字符串我必须提取" AP09BN7886"这实际上是印度车辆的车牌号码。我知道可能最简单的是使用正则表达式,任何人都可以告诉我reg。 exp找到这个。

3 个答案:

答案 0 :(得分:5)

据我了解,您只需删除小写字母和空格即可。可能最有效的解决方案不会使用正则表达式,而是使用以下代码:

s = 'sdnak hsd fds fnsdf APsdf09sdf BN fddsdalf 7886sd f';
s(s~=upper(s) | s==32) = [];

最佳,

答案 1 :(得分:3)

据我了解the format,印度车牌是:

  1. 代表印度国家的两个大写拉丁字母 - 这是[A-Z]{2}
  2. 两个数字代表该州内的序号,因此是\d{2}
  3. 当数字用完时,以字母为前缀的四位数字;所以[A-Z]*\d{4}
  4. (1号和2号组合是州和区的RTO

    您正在尝试从长字符串中收集该组件,并且您没有详细说明该字符串的其他部分以完全消除歧义(例如:字母都是小写字母或非拉丁字符?仅每个字符串一个牌照?只有两个字母前面加上四个数字?等等)由于这是未知的,你可以用.*?

    表示匹配组之间的字符“海洋”

    4位数字之前的变量字母特别模糊,因为字符串中可能存在不相关的大写拉丁字母。

    您可以使用以下正则表达式找到示例,但我不会说会找到所有字符串中的每个commbo:

    ([A-Z]{2}).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})
    

    然后组合四个捕获组。

    Demo

    如果您想更具体,请根据印度各州的两个字母代码对前两个字母进行更改。

    例如:

    (AS|NL|MH  etc).*?(\d{2}).*?([A-Z]{2}).*?(\d{4})
    

    或者,使用RTO

    更全面的匹配

    如果您可以进一步细化捕获组之间的“其他”,则可以使用negative character classan 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