JGF*_*FMK 3 java regex special-characters dollar-sign
我有一个搜索字符串。当它包含美元符号时,我想捕获此后的所有字符,但不包括点或后续的美元符号。后者将构成后续匹配。因此,对于这些搜索字符串中的任何一个......:
"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;
Run Code Online (Sandbox Code Playgroud)
我想返回:
如果搜索字符串包含百分比符号,我还想返回一对 % 符号之间的内容。
下面的正则表达式似乎可以解决这个问题。
"%([^%]*?)%";
Run Code Online (Sandbox Code Playgroud)
推断:
在某些语言允许使用%1, %2, 作为捕获组的情况下,Java 使用backslash\number语法代替。因此,该字符串编译并生成输出。
我怀疑美元符号和点需要转义,因为它们是特殊符号:
$通常是字符串的结尾.是任何字符的元序列。我尝试过使用双反斜杠符号.. \
[^\\.\\$%] %|\\$ 试图结合这种逻辑,但似乎无法发挥任何作用。
我不知道另一双眼睛是否能看到如何解决这个难题!
到目前为止我的尝试:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下链接可能会有所帮助:
您可以使用
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
Run Code Online (Sandbox Code Playgroud)
笔记
\1?在模式末尾添加可选值。由于它是可选的,因此它不限制匹配上下文并且是多余的(因为否定字符类既不能匹配也不能$匹配%)[%$]([^%.$]*)匹配%或,然后将除,和$之外的任何零个或多个字符捕获到组 1 中。您只需要组 1 值,因此使用。%.$matcher.group(1).都不$是特殊的,因此,它们不需要在[%.$]或 中 转义[%$]。| 归档时间: |
|
| 查看次数: |
889 次 |
| 最近记录: |