正则表达式匹配问题:N*G00-G99M00-M99S*X*Y*Z*R*F*LF|;这样的字符串,*表示数字位数随意。

正则表达式匹配问题:“(N*)(G00-G99)(M00-M99)(S*)(X*)(Y*)(Z*)(R*)(F*)(LF|;)“这样的字符串,*表示数字,位数随意(可以是10也可以是1000)。每个字符串可以包含以上括号中的每个,也可以都不包含。
注意1:N*如果出现的话只能出现在字符串的开头;
注意2:括号中的是一体的,即,如果出现G后面才能出现两位数,如果没出现G则G后面的两位数也不能出现;
注意3:G00-G99表示如果出现G的话它后面只能出现00-99之间的两位数不能出现其它也不能出现1位或者3位数等等。M00-M99与G00-G99类似;
注意4:LF或者;号如果出现的话只能出现在字符串的结尾处。
最新回答
风铃鹿

2024-08-02 00:54:04

(?=\b)(N\d{1,})?(([GM]\d{2})|([SXYZRF]\d+))+((LF\b)|;)?(?![;A-Za-z0-9\-])
方案中有个问题:

无法匹配混杂在英文单词之间的字符串,也就是说,必须在要匹配的字符串两端出现空格、中文、符号等,如果连接的是数字或者英文字母,那么不会被匹配。

如果匹配不满意,那么你可以追问,并列举几种可能会出现的情况,这样要比文字表达更加容易被理解。

毕竟正则这东西,许多时候都有点“只可意会,不可言传”的意味。
追问
那你给我写的那个到底能实现不?还有一个问题:据说正则是按顺序匹配的?可是我上面的那些除了开头和结尾,还有G应该在X\Y\Z\R\F的前面外,其他的M\S都是乱序,怎么匹配啊
追答
所谓的顺序匹配,是指正则的匹配过程以及书写过程,我提供给你的正则,是不分GXYZRF的先后的。

说到这一点,我要提醒你的是,我提供的这个正则,允许出现两次及两次以上相同的字母开头,比如下面的字符是匹配的:

G45R77897X2R32

里面出现了两个R

至于好不好用,你测试一下啊,毕竟你才是使用者,我只能做到尽力满足你表达出来的要求。

一般时候,让别人写正则,多多少少总有不满意 的地方。
追问
String strG4P="((G04){1})([^XP]|\bXP\b))*";//表示G04后面没有出现X或P,或者同时出现X和P,对不对?不对的话你给我写一个表示G04后面同时出现X或P的,或者G04后面X或P都不出现的正则。谢谢,方便留个联系方式QQ什么的么,有很多问题请教啊
追答
你说的那个正则有语法错误

G04(XP)?(?![XP])

这个正则实现:

1.G04后面不能单独出现X或P

2. G04后面可以同时出现XP

3. G04后面如果同时出现XP,XP也会被选择匹配

Q是有的,5 5 4 0 0 0 2 1 1。

但我的Q已经好久不用了,平时的时间也不是很多,所以Q现在基本上是摆设。