【发布时间】:2021-02-01 22:35:42
【问题描述】:
我是使用正则表达式的新手,我希望有人可以帮助我。
我有这个正则表达式代码,它应该用来识别指法文件中的选项卡组。它适用于正则表达式测试网站,例如regexr.com、regextester.com 和 extendsclass.com/regex-tester,但是当我使用下面显示的示例文本在 java 中对其进行编码时,我将每一行作为其自己的单独组,而不是 4包含仅由一个换行符分隔的所有文本的组。 我已经通读了这个堆栈溢出线程"Regular expression works on regex101.com, but not on prod" 并且一直小心避免字符串文字问题、多行问题,并且我在 regex101 上尝试了其他正则表达式引擎的代码并且它有效,但它仍然无法在我的 java 代码中工作如下所示。
我尝试启用多行标志,但它仍然不起作用。我认为这是我的代码有问题,但后来我在其他正则表达式测试器网站上得到了同样的错误输出:myregexp.com 和 freeformatter.com/java-regex-tester
这是原始的正则表达式。它是 ling,所以使用上面的正则表达式可能更容易,因为它们都有我所说的相同问题:
RealRegexCode = (^|[\n\r])(((?<=^|[\n\r])[^\S\n\r]*\|*[^\S\n\r]*((E|A|D|G|B|e|a|d|g|b)[^\S\n\r]*\|*(?=(([^\S\n\r]*-[ -]*(?=\|))|([ -]*((\(?[a-zB-Z0-9]+\)?)+[^\S\n\r]*-[ -]*)+((\(?[a-zB-Z0-9]+\)?)+){0,1}[^\S\n\r]*))[|\r\n]|$)))((([^\S\n\r]*-[ -]*(?=\|))|([ -]*((\(?[a-zB-Z0-9]+\)?)+[^\S\n\r]*-[ -]*)+((\(?[a-zB-Z0-9]+\)?)+){0,1}[^\S\n\r]*))\|)+(((?<=\|)[^\S\n\r]*((E|A|D|G|B|e|a|d|g|b)[^\S\n\r]*\|*(?=(([^\S\n\r]*-[ -]*(?=\|))|([ -]*((\(?[a-zB-Z0-9]+\)?)+[^\S\n\r]*-[ -]*)+((\(?[a-zB-Z0-9]+\)?)+){0,1}[^\S\n\r]*))[|\r\n]|$)))((([^\S\n\r]*-[ -]*(?=\|))|([ -]*((\(?[a-zB-Z0-9]+\)?)+[^\S\n\r]*-[ -]*)+((\(?[a-zB-Z0-9]+\)?)+){0,1}[^\S\n\r]*))\|)+)*(\n|\r|$))+
这是一个简化的正则表达式代码,显示相同的问题,提供用于调试
SimplifiedRegexCode = (^|[\n\r])([^\n\r]+(\n|\r|$))+
这是使用正则表达式模式查找匹配项的代码:
public static void main(String[] args){
String filePath = "C:\\Users\\stani\\IdeaProjects\project\\src\\testing files\\guitar - a thousand matches by passenger.txt";
Path path = Path.of(filePath);
List<String> stuff = new ArrayList<>();
try {
String rootStr = Files.readString(path);
Pattern pattern = Pattern.compile("(^|[\\n\\r])([^\\n\\r]+(\\n|\\r|$))+");
Matcher ptrnMatcher = pattern.matcher(rootStr);
while (ptrnMatcher.find()) {
stuff.add(ptrnMatcher.group());
}
}catch (Exception e) {
e.printStackTrace();
}
System.out.println(new Patterns().MeasureGroupCollection);
for (String s:stuff)
System.out.println(s);
}
这是我用来测试的文本。将其复制并粘贴到文本编辑器中可能会有所帮助,因为堆栈溢出可能会扭曲文本的外观:
e|---------------------------------|------------------------------------|
e|------------------------------------------------------------------|
B|-----1--------(1)----1-----------|-------1---------------1----------1-|
B|-----1--------(1)----0---------0-----1---------1-----3--------(3)-|
G|-----------0------------0--------|-------------0----------------0-----|
G|-----------0---------------0---------------0---------------0------|
D|-----0h2-----2-------2-----------|-------2-------2-------0--------0---|
D|-----2-------2-------2-------2-------2-------2-------0-------0----|
A|-3-------3-------3-------3-------|------------------------------------|
A|-0-------0--------------------------------------------------------|
E|-----------------------------0---|---1-------1-------3-------3--------|
E|-----------------0-------0--------1------1-------3-------3--------|
e|-------------------------------------------------------------------|
B|-----1---------1-----1---------1-----3---------3-------1---------1-|
G|-----------0---------------0---------------0-----------------0-----|
D|-----3-------2-------2-------2-------0-------0---------2-------2---|
A|-----------------3-------3-------------------------3-------3-------|
E|-1-------1-----------------------3-------3-------------------------|
它应该从文本中识别出四个不同的组。但是,在 java 和我上面提到的两个测试器中,它会将每一行识别为自己的不同组(即 12 个组)
【问题讨论】:
-
Pattern.MULTILINE(和this post)可能会有所帮助。 ...docs.oracle.com/javase/8/docs/api/java/util/regex/… -
"默认情况下,正则表达式 ^ 和 $ 忽略行终止符,仅分别匹配整个输入序列的开头和结尾。如果激活 MULTILINE 模式,则 ^ 匹配开头输入和除输入末尾之外的任何行终止符之后。在 MULTILINE 模式下,$ 匹配行终止符之前或输入序列的结尾。"
-
我很想听听旋律。请放音乐!!!
标签: java regex algorithm regex-group musicxml