帮助清理Java中的Code-39条形码数据
我需要清除字符串中的非法条形码-39数据,并将每个非法字符更改为空白。 目前条形码-39中唯一有效的字符是0-9、A-Z、(破折号)、(点)、$(美元符号)、/(正斜杠)、+(加号)、%和一个空格 我尝试了下面的正则表达式,但它似乎只在第一组字符中使用not运算符帮助清理Java中的Code-39条形码数据,java,regex,barcode,Java,Regex,Barcode,我需要清除字符串中的非法条形码-39数据,并将每个非法字符更改为空白。 目前条形码-39中唯一有效的字符是0-9、A-Z、(破折号)、(点)、$(美元符号)、/(正斜杠)、+(加号)、%和一个空格 我尝试了下面的正则表达式,但它似乎只在第一组字符中使用not运算符 barcode = barcode.toUpperCase().replaceAll("[^A-Z0-9\\s\\-\\.\\s\\$/\\+\\%]*"," "); 代码似乎只解释,如果不是A到Z,则替换为空格。如何解释,如果不是
barcode = barcode.toUpperCase().replaceAll("[^A-Z0-9\\s\\-\\.\\s\\$/\\+\\%]*"," ");
代码似乎只解释,如果不是A到Z,则替换为空格。如何解释,如果不是A-Z,不是0-9,不是破折号,不是美元符号,不是正斜杠,等等,那么用空格替换字符
任何帮助都会很好。为什么要在末尾加“*”?我认为这是不必要的,更重要的是会把事情搞得一团糟。为什么要在结尾加上“*”?我认为这是不必要的,更重要的是会把事情搞砸。尝试将模式字符串更改为
[^-0-9A-Z.$/+%]
;这将匹配规范中未包含的单个字符。另外,如果这是将执行多次的代码,请避免使用String.replaceAll()
,因为您的模式将针对每个方法调用进行编译。相反,使用预编译模式,如下所示:
final static Pattern INVALID_CODE39_CHAR = Pattern.compile("[^-0-9A-Z.$/+% ]");
barcode = INVALID_CODE39_CHAR.matcher(barcode.toUpperCase()).replaceAll(" ");
如果要用单个替换字符串替换连续的无效字符,请在模式末尾添加一个+
。原始模式中的*
将匹配零个或多个不在字符类中的字符;实际上,在所有字符之后添加替换字符串
(空格)
barcode = barcode.toUpperCase().replaceAll("[^A-Z0-9\\s\\-\\.\\s\\$/\\+\\%]*"," ");
查看JavaDoc了解更多信息;另外,它非常有用。尝试将模式字符串更改为
[^-0-9A-Z.$/+%]
;这将匹配规范中未包含的单个字符。另外,如果这是将执行多次的代码,请避免使用String.replaceAll()
,因为您的模式将针对每个方法调用进行编译。相反,使用预编译模式,如下所示:
final static Pattern INVALID_CODE39_CHAR = Pattern.compile("[^-0-9A-Z.$/+% ]");
barcode = INVALID_CODE39_CHAR.matcher(barcode.toUpperCase()).replaceAll(" ");
如果要用单个替换字符串替换连续的无效字符,请在模式末尾添加一个+
。原始模式中的*
将匹配零个或多个不在字符类中的字符;实际上,在所有字符之后添加替换字符串
(空格)
barcode = barcode.toUpperCase().replaceAll("[^A-Z0-9\\s\\-\\.\\s\\$/\\+\\%]*"," ");
查看JavaDoc了解更多信息;而且,它非常有用。对于不在括号中的任何字符,*都是状态。是否需要在每组字母上放置插入符号?
*
不适用于括号中未包含的任何字符。它用于括号中字符的多个实例,将是“贪婪的”。它会在结果字符串中添加额外的空格,*是不在括号中的任何字符的状态。是否需要在每组字母上放置插入符号?*
不适用于括号中未包含的任何字符。它用于括号中字符的多个实例,将是“贪婪的”。它会在结果字符串中添加额外的空格。