【问题标题】:regexp for finding substring(vehicle number plate) in matlab from long string?用于在matlab中从长字符串中查找子字符串(车牌)的正则表达式?
【发布时间】:2015-04-23 06:24:23
【问题描述】:

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

【问题讨论】:

  • 与其他文本相比,什么定义了许可证号?所有可能的格式是什么?

标签: regex matlab


【解决方案1】:

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

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

最好的,

【讨论】:

  • 嘿,感谢您的解决方案。我的字符串有时像这样“7:1AP09BN7886”,我也必须删除这个 7:1,基本上最终的字符串应该以字符而不是数字或任何其他特殊字符开头。我该怎么做?
  • 好的,这最好用正则表达式来完成,但你应该从一开始就这么说!在写另一个答案之前,我们还应该知道其他限制吗?
【解决方案2】:

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

  1. 代表印度国家的两个大写拉丁字母 - 即[A-Z]{2}
  2. 两位数字代表该州内的序号,即\d{2}
  3. 然后四位数字用完时以字母为前缀;所以[A-Z]*\d{4}

(数字 1 和数字 2 组合为州和地区的RTO

您试图从一个长字符串中收集其中的组成部分,并且您没有对字符串的其他部分进行足够的详细说明以完全消除歧义(例如:字母都是小写或非拉丁字符?仅每个字符串一个车牌?四个数字前只有两个字母?等等)由于这未知,你可以用.*?表示匹配组之间的字符“海”@

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

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

([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})

然后你需要考虑一些例外情况(特殊的德里地区代码、外交车牌、虚荣车牌、军事车牌、哦男孩……)

【讨论】:

  • 感谢您的回答我使用了第一个建议的常规 exp 并且它有效,但是第二个(AS|NL|MH 等)。*?(\d{2}).*?([A-Z ]{2}).*?(\d{4}) 不起作用。这就是我使用的表达式='(LD|AP|MH|​​AR|ML|AS|MN|BR|MP|CG|MZ|CH|NL|DD|OD|DL|PB|DN|PY|GA|RJ |GJ|SK|HR|TN|HP|TR|JH|TS|JK|UK|KA|UP|KL|WB).*?(\d{2}).*?([A-Z]{2}) .*?(\d{4}';
  • 请注意,最后四位数字之前的字母是可变的。虽然是描述性的,但它们由([A-Z]*) 表示,这使得消除周围的文本变得困难。实际上,您可能会考虑将([A-Z]+) 用于一个或多个或([A-Z]{2,}) 用于两个或多个,并且知道在每个 RTO 中有 9,999 辆没有字母前缀的早期汽车您不会匹配。 ;-)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多