![](/img/trans.png)
[英]How to match a string with a regex only if it's between two delimiters?
[英]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
您的原始模式很好。 我只是這樣使其更具可讀性:
^(?:[^+]*\\+){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.