問題描述
使用 Java‑Regex 與 Regex 成對拆分多行文本 (Split text with Java‑Regex in pairs with Regex over several lines)
I have following text:
my‑widget{
color: #{mycolors.getColors(1)}
}
...
my‑tridget{
color: #{mycolors.getColors(2)}
...
}
...
I want to split the text in pairs, where the delimiter is #{mycolors.getColors()} and the text between previous delimeter and current delimiter will be saved. E.g. for such pairs:
Pair 1: text: my‑widget{ color: number: 1
Pair 2: text: } ... my‑tridget{ color: number: 2
What I am used so far,
Pattern p = Pattern.compile("(.*)#\\{mycolors.getColor\\(([0‑9])\\)\\}", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);
Matcher m = p.matcher(data);
while (m.find){
String number = m.group(2).toLowerCase().trim();
String text = m.group(1);
}
But number and text will be to:
text: color: number: 1
text: color: number: 2
So the text doesn't go over several lines. How can I achieve this ? (The Pattern.DOTALL in addtion to Pattern.MULTILINE didn't help me)
參考解法
方法 1:
Some mistakes you're making:
- To match text across multiple lines you need to use
Pattern.DOTALL
instead ofPattern.MULTILINE
- Instead of
.*
make it non greedy.*?
- Your text has string
getColors
but you havegetColor
in your regex
Following regex pattern should work out for you:
Pattern p = Pattern.compile("(.*?)#\\{mycolors.getColors\\((\\d+)\\)\\}",
Pattern.CASE_INSENSITIVE|Pattern.DOTALL);