使用Java正则表达式在字符串中间查找匹配的字符串

时间:2014-01-29 20:35:59

标签: java regex string

我需要验证文件输入以确保它具有正确的版本控制。例如,这是输入文件:W:\\folder\\test_v2301_01_29_2014_1420.pfd

我在Java中构建了一个正则表达式来查找我正在寻找的用于验证文件的版本控制字符串。

RegEx: v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}但是,它失败了,因为正则表达式正在查看文件的开头。

致电: if (!arcvalFileFormBean.getTxtFileReview().matches("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}"))

搜索字符串的最佳方法是什么,不知道从一开始会有多远?

2 个答案:

答案 0 :(得分:2)

试试这个:

if (!arcvalFileFormBean.getTxtFileReview().matches(
               ".*?v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}.*"))

String#matches尝试在版本正则表达式之前匹配完整输入.*?,之后.*将确保此模式在输入中匹配任何地方

答案 1 :(得分:1)

您可以先编译模式,创建匹配器实例,然后在返回的匹配器上调用find(),而不是向RegEx添加前导和尾随匹配所有参数。

Pattern pattern = Pattern.compile("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}");
Matcher matcher = pattern.matcher(arcvalFileFormBean.getTxtFileReview());

if (!matcher.find()) {
    ...
}

Matcher还提供了matches()操作,尽管它在String中的匹配器函数中表现为只有在整个字符串与RegEx模式匹配时才返回true。

模式/匹配器结构可用于发现某个子字符串是否与模式匹配,如果是,则替换此字符串的某些部分。即我们使用这种方法来使用包含类似逻辑的自定义Logback CompositeConverter来掩盖日志语句中的某些密码,如下所示:

Pattern urlAuthPattern = Pattern.compile("//(.*?):.*?@");
Matcher matcher = urlAuthPattern.matcher("ftp://user1:userPW@localhost:21/path/to/somewhere");
if (matcher.find()) {
    // should return ftp://user1:XXX@localhost:21/path/to/somewhere
    return matcher.replaceAll("//$1:XXX@");
}