我需要清除一个字符串中的非法条形码-39数据,并将每个非法字符更改为空白。目前条形码-39中唯一有效的字符是0-9、a - z、-(破折号)、。(点)、$(美元符号)、/(正斜杠)、+(加号)、%(百分号)和一个空格。
我尝试了下面的正则表达式,但它似乎只在第一组字符中使用非操作符。
barcode = barcode.toUpperCase().replaceAll("[^A-Z0-9\s\-\.\s\$/\+\%]*"," ");
代码似乎只解释,如果不是A到Z,那么用空格替换。我如何解释它,如果不是a - z,不是0-9,不是破折号,不是美元符号,不是正斜杠,等等,然后用空格替换char。
尝试将模式字符串更改为[^-0-9A-Z.$/+% ]
;这将匹配不在Code 39规范中的单个字符。此外,如果这是将被执行多次的代码,请避免使用String.replaceAll()
,因为您的模式将为每个方法调用编译。相反,可以使用预编译的模式,如下所示:
final static Pattern INVALID_CODE39_CHAR = Pattern.compile("[^-0-9A-Z.$/+% ]");
barcode = INVALID_CODE39_CHAR.matcher(barcode.toUpperCase()).replaceAll(" ");
如果您想用单个替换字符串替换连续的无效字符,请在模式的末尾添加+
。原始模式中的*
将匹配零个或多个不在字符类别中的字符;实际上,在所有字符之后添加您的替换字符串(空格)。
查看模式JavaDoc以获取更多信息;这也是非常有用的
为什么"*"在结尾?我认为这是不必要的,而且会把事情搞得一团糟。