在java中使用正则表达式从基于下划线的字符串中获取子字符串
我正在开发一个中间件工具,其中有一个预定义的选项,可以将java正则表达式与subStringRegEx(regex,string)一起使用 我的要求是从给定的文件名(例如:在java中使用正则表达式从基于下划线的字符串中获取子字符串,java,regex,Java,Regex,我正在开发一个中间件工具,其中有一个预定义的选项,可以将java正则表达式与subStringRegEx(regex,string)一起使用 我的要求是从给定的文件名(例如:ABC\u XYZ\u 123\u adbc1234-ed98\u 1234.dat)中获取下划线(u)之间所需的子字符串 我已经尝试了以下3种方法,当通过选择java使用在线工具进行测试时,这些方法都可以正常工作。虽然在我的工具中没有按预期工作,但我得到的是“ABC_XYZ_123_adbc1234-ed98”而不是“ad
ABC\u XYZ\u 123\u adbc1234-ed98\u 1234.dat
)中获取下划线(u)之间所需的子字符串
我已经尝试了以下3种方法,当通过选择java使用在线工具进行测试时,这些方法都可以正常工作。虽然在我的工具中没有按预期工作,但我得到的是“ABC_XYZ_123_adbc1234-ed98”而不是“adbc1234-ed98”值
(?:[^.]+)\u(?:[^.]+)\ u(?:[^.]+)\ u([^.]+)
*?。。。。。。。([^.]+)
^[^\uU]*.[^\ uU]*.[^\ uU]*.[^\ uU]*.[^\ uU]*.
^(?:[^_]+_){3}([^_]+).*
并替换为$1
。看
详情:
-字符串的开头^
-除(?:[^]+{3}
以外的任何一个或多个字符出现三次,然后出现一个
字符
-第1组(在替换模式中以([^]+)
引用):除$1
\ucode>之外的一个或多个字符
-字符串的其余部分*
^..*.[u0-9]+\..[^.]*$
请参阅,您仍然需要替换为$1
详情:
-字符串的开头^
-任何文本(不包括尽可能多的换行符)*
字符
-一个或多个字符,而不是([^]+)
。
字符
-一个或多个数字[0-9]+
-a\.
字符(注意:
可能需要加倍)\
-除[^.\u]*
和
之外的任何零个或多个字符
-字符串结束$
^(?:.*?_){3}([^_]*)_.*\.dat$
或者,如果文件的格式可能是任何格式(除了.dat
),请尝试以下操作
^(?:.*?_){3}([^_]*)_.*
解释:为上述正则表达式添加详细解释
^(?:.*?_){3} ##Matching from starting of value, using non greedy match till _ 3 times in a non capturing group.
([^_]*) ##Creating 1st capturing group which has values till 1st Occurrence of _ in it.
_.*\.dat$ ##Matching from _ to till dat at the end of value.
您可以简单地使用字符串方法来实现这一点:
const str=“ABC_XYZ_123_adbc1234-ed98_1234.dat”
const charSet=str.substr(0,str.length-4).split(“”).join(“”)
console.log(charSet)
我不确定子字符串regex(regex,string)
的规范,但是如果它在字符串中返回与regex
匹配的子字符串($0
),那么它应该是
String regex = "[^_]+(?=_[^_]*$)";
为了完整起见,所有3种模式都可以工作,但您必须从组1中获得值
范例
String patterns[] = {
"(?:[^_]+)_(?:[^_]+)_(?:[^_]+)_([^_]+)",
".*?_.*?_.*?_([^_]+)",
"^[^_]*_[^_]*_[^_]*_([^_]*)_"
};
String s = "ABC_XYZ_123_adbc1234-ed98_1234.dat";
for (String p : patterns) {
Pattern pattern = Pattern.compile(p);
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
}
输出
adbc1234-ed98
adbc1234-ed98
adbc1234-ed98
请参阅a。为什么要使用正则表达式进行此操作?只需使用split(“_”)所有3种模式都有效,您的值在捕获组1中。使用并从捕获组中获取值难道不起作用吗?嗨,库马尔,您有时间测试了吗?第一个是通用的,第二个是更具体的,你可以试着两者都看哪一个最适合你。你忽略了这样一个事实:“我们有一个预定义的选项,可以将java正则表达式与subStringRegEx(regex,string)
”这篇文章有javascript
标记,现在我看到它只与java相关:D