Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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/9/google-cloud-platform/3.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正则表达式_Java_Regex - Fatal编程技术网

包含下划线的Java正则表达式

包含下划线的Java正则表达式,java,regex,Java,Regex,我尝试使用下面的一行,它忽略下划线,但我想将其更改为包含下划线 String name = "$SF_Update$"; String regexp = "\\$(.*?)(?:[\\_].*)?\\$"; // want to change this line Pattern pattern = Pattern.compile(regexp); Matcher matcher = pattern.matcher(name); 我尝试了以下选项: String regexp ="\\$([a-

我尝试使用下面的一行,它忽略下划线,但我想将其更改为包含下划线

String name = "$SF_Update$";
String regexp = "\\$(.*?)(?:[\\_].*)?\\$"; // want to change this line
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(name);
我尝试了以下选项:

String regexp ="\\$([a-zA-Z]+(?:_[a-zA-Z]+)*)\\$"
它包括下划线,但考虑到下一行字符串的结尾也没有$,例如: “$SF\U更新$” “$SF_Updateone” 请提供解决方案。

代码:

String str1 = "$SF_Update$";
String str2 = "$SF_Update_One$";
String str3 = "$SF_Update_One";
Pattern pattern = Pattern.compile("\\$([^_]+_{1}[^_]+)\\$");
Matcher matcher1 = pattern.matcher(str1);
Matcher matcher2 = pattern.matcher(str2);
Matcher matcher3 = pattern.matcher(str3);
if (matcher1.matches())
    System.out.println(str1 + " => " + matcher1.group(1));
else
    System.out.println(str1 + " => " + "No Match.");
if (matcher2.matches())
    System.out.println(str2 + " => " + matcher2.group(1));
else
    System.out.println(str2 + " => " + "No Match.");
if (matcher3.matches())
    System.out.println(str3 + " => " + matcher3.group(1));
else
    System.out.println(str3 + " => " + "No Match.");
输出:

$SF_Update$ => SF_Update
$SF_Update_One$ => No Match.
$SF_Update_One => No Match.

尝试此表达式:

\$[A-Za-z]+(_[A-Za-z]+)*\$
我是在家里做的

如果名字可以有数字:

\$[A-Za-z0-9]+(_[A-Za-z0-9]+)*\$

它为我制定了规则。

如果您想捕获$和断言下划线存在之间的所有内容,请使用以下正则表达式:

\\$(.*?)_([^_]*)\\$
(.*)
匹配一个符号,然后尝试匹配下划线。如果不匹配,
(.*)
将匹配此符号,正则表达式将再次尝试匹配下划线


匹配下划线后,
([^\]*)
将所有非下划线的内容匹配0次或更多次。

我认为从非捕获组中删除
\\\$(.*)([\\].*))\\$
就足够了,如下所示:
\\$([\\].*)您只是想捕获两个美元符号之间的所有内容,如
\\\$([^$]+)\\$
?我想捕获$之间的所有内容,但只捕获第一个下划线。“$SF_更新$”;不应捕获“$SF_Update_one$”;请尝试
“\\$([^ u$]+)\([^ u$]+)\$”
[^ u$]+
以外的一个或多个字符匹配。如果里面没有任何空格,请将
\\s
添加到
[…]
(即
“\\$([^\\\\\\\\\\$)\([^\\\\\\\\\\\\\\\\\\$”
)这是在捕获该字符串中的所有下划线,如何仅捕获第一个下划线,而不捕获连续的下划线,如:“$SF Update$”;不应捕获“$SF_Update_one$”;这个正则表达式不匹配
$SF\u Update\u one$
抱歉,如果我把你弄糊涂了,我可能会这样问:matcher.group(1)应该只匹配(或选择)“$SF\u Upadate$,而不是$SF\u Update\u one$使用
matcher.group(0)
若要获取所有与regexUse
matcher.matches匹配的字符串,请执行以下操作。
若要检查此正则表达式是否匹配字符串“$SF\u Update\u One$`@user8059207,这没有帮助?很抱歉,我遇到了一些网络问题,无法登录。否,结果是只有SF被选为组(1),对于组(0),整个字符串被选中”$SF_Update$@user8059207预期的输出是什么?请指定一个或两个输入/输出组合。输入字符串=“$SF_Update$”和“$SF_Update_one$”,所需输出应显示在匹配器中。组(1)应仅为“SF_Update”,而不是SF_Update_one(只有第一个下划线应匹配).hey Chiranjib,这部分是正确的。第二个字符串$SF_Update_One$不应匹配,因为它有第二个下划线。