我正在尝试为通过 TCP/IP 套接字传入的 String
制作正则表达式。
$AVSYS,99999999,V1.17,SN0000103,32768*16
每个字符串应以美元符号 $
和 5 到 6 位数字之间的大写字母字符开头。它们以 *
和 2 位字母数字校验和结尾。每个字段均以逗号 ,
分隔,并且可以是任何字符串。
我为它创建了一个正则表达式。
^\$[A-Z]{5,6}(\,.*)(\,.*)(\,.*)(\,.*)(\,.*)\*[\d\w]{2}$
我预计它会匹配,但事实并非如此。尽管我已经阅读了 Java 文档,但我仍然不熟悉正则表达式。请帮助我获得正确的正则表达式。
已编辑
根据回复修复了正则表达式后,我尝试了这两个。
^\$[A-Z]{5,6}(\,.*)(\,.*)(\,.*)(\,.*)(\,.*)\*[\d\w]{2}$
^\$[A-Z]{5,6}(\,.*?)(\,.*?)(\,.*?)(\,.*?)\*[\d\w]{2}$
但是我得到的结果比我预期的要多。
$AVSYS,99999999,V1.17,SN0000103,32768*16
$AVRMC,80000551,144811,A,4351.3789,N,07923.4712,W,0.00,153.45,091107,A,,161,1*64
$AVRMC,80000551,144811,A,4351.3789,N,07923.4712,W,0.00,153.45,091107,A,,161,1,0,0*64
$EAVSYS,99999999,12345678901234567890,9057621228,,,*0B
以上句子都与正则表达式匹配。但我只想得到 1)。 我怎样才能实现这个目标?
最佳答案
要匹配任意数量的逗号分隔组,您可以使用以下表达式:
^\$[A-Z]{5,6}(,[^,*]*)*\*[\da-zA-Z]{2}$
数据部分与此表达式匹配:
(,[^,*]*)*
它匹配零个或多个以逗号开头的字符组,后跟除逗号或星号之外的任意数量的字符。一旦到达逗号或星号,表达式引擎就会检查它是否是新值或末尾的校验和。
如果校验和不允许小写字母,请将a-zA-Z
替换为A-Z
。
关于java - 如何获取与这些字符串匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15172285/