簡體   English   中英

正則表達式代碼未收集多行匹配模式

[英]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.comfreeformatter.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/

多行修飾符是必需的。

這樣做的主要問題是您正在處理表達式前后的換行符。 我以幾種方式修改了表達式:

  • 使正則表達式僅在末尾匹配換行符,始終在開頭尋找^
  • 將回車換行組合匹配為 \r?\n 作為回車,在使用時應始終后跟換行。
  • 使用非捕獲組來改善開銷並降低查看匹配項時的復雜性。 這是?:就在括號內。 這意味着該組不會被捕獲在結果中,僅用於封裝。

我開始測試您較長的正則表達式並且可能會對其進行更新,盡管聽起來您已經知道如何處理較短的正則表達式已更正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM