Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助清理Java中的Code-39条形码数据_Java_Regex_Barcode - Fatal编程技术网

帮助清理Java中的Code-39条形码数据

帮助清理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,则替换为空格。如何解释,如果不是

我需要清除字符串中的非法条形码-39数据,并将每个非法字符更改为空白。 目前条形码-39中唯一有效的字符是0-9、A-Z、(破折号)、(点)、$(美元符号)、/(正斜杠)、+(加号)、%和一个空格

我尝试了下面的正则表达式,但它似乎只在第一组字符中使用not运算符

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了解更多信息;而且,它非常有用。

对于不在括号中的任何字符,*都是状态。是否需要在每组字母上放置插入符号?
*
不适用于括号中未包含的任何字符。它用于括号中字符的多个实例,将是“贪婪的”。它会在结果字符串中添加额外的空格,*是不在括号中的任何字符的状态。是否需要在每组字母上放置插入符号?
*
不适用于括号中未包含的任何字符。它用于括号中字符的多个实例,将是“贪婪的”。它会在结果字符串中添加额外的空格。