Java 正则表达式 (java.util.regex)。搜索美元符号
Java regex (java.util.regex). Search for dollar sign
我有一个搜索字符串。
当它包含美元符号时,我想捕获其后的所有字符,但不包括点或随后的美元符号。后者将构成后续匹配。
所以对于这些搜索字符串中的任何一个......:
"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;
我想 return:
- V_N
- XYZ
如果搜索字符串包含百分号,我还想return这对 % 符号之间是什么。
下面的正则表达式似乎可以解决这个问题。
"%([^%]*?)%";
推断:
- 以 % 开始和结束,
- 有一个捕获组-()
- 有一个字符 class 包含除 % 符号以外的任何内容,(插入符号推断不是字符)
- 重复 - 但不贪婪 *?
有些语言允许 %1
、%2
用于捕获组,而 Java 使用 backslash\number
语法。所以,这个字符串编译并生成输出。
我怀疑美元符号和点需要转义,因为它们是特殊符号:
$
通常是字符串的结尾
.
是任何字符的元序列。
我试过使用双反斜杠符号.. \
- 两者都是字符 classes .e.g.
[^\.\$%]
- 并使用 OR'd 符号
%|\$
试图结合这个逻辑,似乎无法得到任何发挥作用。
不知有没有一双眼睛可以看到如何解决这个难题!
我目前的尝试:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "([%\$])([^%\.\$]*?)\1?";
/* Either % or $ in first capture group ([%\$])
* Second capture group - anything except %, dot or dollar sign
* non greedy group ( *?)
* then a backreference to an optional first capture group \1?
* Have to use two \, since you escape \ in a Java string.
*/
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(search);
List<String> results = new ArrayList<String>();
while (m.find())
{
for (int i = 0; i<= m.groupCount(); i++) {
results.add(m.group(i));
}
}
for (String result : results) {
System.out.println(result);
}
}
}
以下链接可能会有帮助:
您可以使用
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "[%$]([^%.$]*)";
Matcher matcher = Pattern.compile(pattern).matcher(search);
while (matcher.find()){
System.out.println(matcher.group(1));
} // => V_N, XYZ
参见Java demo and the regex demo。
注意
- 模式末尾不需要可选的
?
。因为它是可选的,所以它不限制匹配上下文并且是多余的(因为否定字符 class 既不能匹配 $
也不能匹配 %
)
[%$]([^%.$]*)
匹配 %
或 $
,然后将任何零个或多个捕获到第 1 组
%
、.
和 $
以外的字符。您只需要第 1 组值,因此使用 matcher.group(1)
。
- 在character class中,
.
和$
都不是特殊的,因此在[%.$]
或[%$]
中不需要转义。
我有一个搜索字符串。 当它包含美元符号时,我想捕获其后的所有字符,但不包括点或随后的美元符号。后者将构成后续匹配。 所以对于这些搜索字符串中的任何一个......:
"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;
我想 return:
- V_N
- XYZ
如果搜索字符串包含百分号,我还想return这对 % 符号之间是什么。
下面的正则表达式似乎可以解决这个问题。
"%([^%]*?)%";
推断:
- 以 % 开始和结束,
- 有一个捕获组-()
- 有一个字符 class 包含除 % 符号以外的任何内容,(插入符号推断不是字符)
- 重复 - 但不贪婪 *?
有些语言允许 %1
、%2
用于捕获组,而 Java 使用 backslash\number
语法。所以,这个字符串编译并生成输出。
我怀疑美元符号和点需要转义,因为它们是特殊符号:
$
通常是字符串的结尾.
是任何字符的元序列。
我试过使用双反斜杠符号.. \
- 两者都是字符 classes .e.g.
[^\.\$%]
- 并使用 OR'd 符号
%|\$
试图结合这个逻辑,似乎无法得到任何发挥作用。
不知有没有一双眼睛可以看到如何解决这个难题!
我目前的尝试:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "([%\$])([^%\.\$]*?)\1?";
/* Either % or $ in first capture group ([%\$])
* Second capture group - anything except %, dot or dollar sign
* non greedy group ( *?)
* then a backreference to an optional first capture group \1?
* Have to use two \, since you escape \ in a Java string.
*/
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(search);
List<String> results = new ArrayList<String>();
while (m.find())
{
for (int i = 0; i<= m.groupCount(); i++) {
results.add(m.group(i));
}
}
for (String result : results) {
System.out.println(result);
}
}
}
以下链接可能会有帮助:
您可以使用
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "[%$]([^%.$]*)";
Matcher matcher = Pattern.compile(pattern).matcher(search);
while (matcher.find()){
System.out.println(matcher.group(1));
} // => V_N, XYZ
参见Java demo and the regex demo。
注意
- 模式末尾不需要可选的
?
。因为它是可选的,所以它不限制匹配上下文并且是多余的(因为否定字符 class 既不能匹配$
也不能匹配%
) [%$]([^%.$]*)
匹配%
或$
,然后将任何零个或多个捕获到第 1 组%
、.
和$
以外的字符。您只需要第 1 组值,因此使用matcher.group(1)
。- 在character class中,
.
和$
都不是特殊的,因此在[%.$]
或[%$]
中不需要转义。