簡體   English   中英

正則表達式獲取一兩個定界符之間的字符串

[英]regex to get string between one or two delimiters

給定以下字符串,類別之間用“ +”(加號)分隔

a1
a1+b1
a1+b2
a1+b1+c1
a2+b3
a2+b4

我想提取所有類別。 必須多次運行,每個級別運行一次。 給定此示例,將需要運行三個:

運行1

a1
a1
a1
a1
a2
a2

運行2

b1
b2
b1
b3
b4

運行3

c1

我已經有一些代碼,但是由於我擁有更多的級別,所以我想使其更具可讀性,因此我可以以某種方式輕松地指出要提取的級別(因此在類別之前有多少個加號)。

這是我當前的3級正則表達式

^[^\+]*\+[^\+]*\+([^\+]*)\+?.*

僅供參考:此代碼與Cellfie forProtégé一起運行,后者使用Java Regex模式

回答

作為將來的參考,這是我在Cellfie中借助此答案所做的工作

提取除以分隔符的多個級別

但是,有時我還是會得到僅空白字符作為結果...無論如何要排除那些字符?

這應該工作。

正則表達式:

(\w+)(?:\+(\w+))?(?:\+(\w+))?

輸入:

a1
a1+b1
a1+b2
a1+b1+c1
a2+b3
a2+b4

輸出:

在此處輸入圖片說明

Java代碼:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JAVAOCA {

    public static void main(String[] args) {
        final String regex = "(\\w+)(?:\\+(\\w+))?(?:\\+(\\w+))?";
        final String string = "a1\n"
                + "a1+b1\n"
                + "a1+b2\n"
                + "a1+b1+c1\n"
                + "a2+b3\n"
                + "a2+b4";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

組:

$ 1

a1
a1
a1
a1
a2
a2

$ 2

b1
b2
b1
b3
b4

$ 3

c1

參見: https : //regex101.com/r/qSz5WT/1

您的原始模式很好。 我只是這樣使其更具可讀性:

  • ^(?:[^+]*\\+){2}([^+]*)其中{2}是要跳過的加號的數量。

請注意,在字符類中時,您無需轉義加號。

或者,如果您更喜歡Edulynch建議的\\w ,那么它將是:

  • ^(?:\\w*\\+){2}(\\w*)

但是我發現,由於額外的反斜杠,將其編碼為Java字符串時可讀性較差。

嘗試使用定界符分割每個字符串。

int max_level=0;
ArrayList<ArrayList<String>> levels = new ArrayList<ArrayList<String>>();
for(int i=0;i<inputs.length;i++)
   {
   items=inputs[i].split("\\+");
   for(int j=0;j<items.length;j++)
      {
      if(j>max_level)
         {
         max_level=j;
         ArrayList<String> strings=new ArrayList<>();
         levels.add(strings);
         }
      levels.get(j).add(items[j]);
      }
  }

現在,levels.get(0)將為您提供第一級的項目列表。 這里使用的唯一正則表達式是\\\\+

因為您有3 列,並且希望每次匹配 其中一列,所以您只需要一個具有3個可選\\w+2個可選\\+正則表達式 而已。

結果
/(\\w+)?\\+?(\\w+)?\\+?(\\w+)?/

然后
$1包含第一列
$2包含第二列
$3包含第三欄
證明

根據您從Patrick接受的解決方案:

^(?:[^+]*\+){2}([^+]*)

(用於標識感興趣的第三組),為避免空字符串匹配,您可以嘗試將最后一個*替換為+

^(?:[^+]*\+){2}([^+]+)

這不應該匹配空字符串。

暫無
暫無

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

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