香草正则表达式:是否可以只使用正则表达式从字符串的中间部分修剪特定的字符



所以目前我正在使用一个解析的yaml文件,该文件使用Regex来验证贷款模式中的字符串值。

具体来说,现在我正在进行邮政编码验证。我看到了这篇文章,它提供了一种方法来验证包含连字符和空格的邮政编码的正则表达式。

我当前的模式^d{5}(?:[-s]d{4})?s+$g与以下示例格式匹配,接受5dig或9dig zip:

12345-1234
12345 1234
12345

我在Stack Overflow中找到了这个解决方案,并将其与这种方法相结合,以修剪字符串末尾的空白。

虽然这最初符合标准,但我的公司要求我为以下输出替换/刮去邮政编码值中的任何连字符或空格

12345-1234 -> 123451234
12345 1234 -> 123451234
12345  -> 12345

我可以直接在Java中完成这项工作,但由于我已经在Java中开发了一个运行数百种不同字符串验证的框架,我希望避免只为这一个字符串验证制作特定的代码块。

有没有一种有效的方法可以让我只使用香草正则表达式来修剪字符串中间的字符?

Java确实支持查找,但如果您使用replaceAll,您也可以用2个捕获组进行替换,因为查找的成本可能很高。(没有香草正则表达式,有很多不同的正则表达式引擎(

注意s也可以匹配换行符,末尾的s+匹配1个或多个空白字符,这些字符可能会更改yaml文件的格式。

相反,您可以使用h来匹配水平空白字符。

在模式中使用[-s]匹配单个字符,即-或空白字符。如果它们中总是有一个存在,也许更多,你也可以在那里使用量词。

^(d{5})(?:[-h]+(d{4}))?h+$

Regex演示| Java演示

String regex = "^(\d{5})(?:[-\h]+(\d{4}))?\h+$";
String string = "12345-1234 n"
+ "12345 1234 n"
+ "12345 ";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
System.out.println(matcher.replaceAll("$1$2"));

输出

123451234
123451234
12345

最新更新