[英]Regex code not collecting multiple lines of matching pattern
我是使用正則表達式的新手,我希望有人可以幫助我。
我有這個正則表達式代碼,它應該識別指法文件中的選項卡組。 It works on regex testing websites such as regexr.com , regextester.com , and extendsclass.com/regex-tester , but when I code it in java using the example text shown below, I am given each individual line as its own separate group , 而不是 4 組包含僅由一個換行符分隔的所有文本。 我已通讀此堆棧溢出線程“正則表達式適用於 regex101.com,但不適用於 prod” ,並且一直小心避免字符串文字問題、多行問題,並且我在 regex101 上嘗試了使用其他正則表達式引擎的代碼並且它有效,但是,它在我的 java 代碼中仍然不起作用,如下所示。
我嘗試啟用多行標志,但它仍然不起作用。 我認為這是我的代碼有問題,但后來我在其他正則表達式測試器網站上得到了同樣的錯誤 output: 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 組)
因為我熟悉正則表達式和吉他哈哈,所以我忍不住對此做出了回應。
對於您的短正則表達式,請參閱 regex101.com 上的以下正則表達式: https://regex101.com/r/NqGhoh/1/
多行修飾符是必需的。
這樣做的主要問題是您正在處理表達式前后的換行符。 我以幾種方式修改了表達式:
^
。?:
就在括號內。 這意味着該組不會被捕獲在結果中,僅用於封裝。我開始測試您較長的正則表達式並且可能會對其進行更新,盡管聽起來您已經知道如何處理較短的正則表達式已更正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.