描述
此表达式将捕获每个部分的前 4 行文本。
^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})
展开
^:[^:]*:
匹配分节符
.*?
匹配与分节符在同一行的文本行
(?
此捕获组将匹配不是分节符的整行
^
匹配行首
(?:(?!^:[^:]*:|[\r\n]|\Z).)*
匹配行上的所有字符,前提是它们不是节标题、换行符或字符串的结尾
[\r\n\Z]*
匹配任意数量的换行符或字符串结尾
){3}
尝试匹配其中三行。请注意,内部条件是自动限制的,并且会阻止捕获比部分可能包含的更多行。
Java 代码示例:
输入文本
:10A: Line number 1
Line number 2
Line number 3
Line number 4
Line number 5
Line number 6
:11A:Line number 1
Line number 2
Line number 3
Line number 4
:10A: Line number 1
Line number 2
:12P:Line number 1
Line number 2
代码
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
public static void main(String[] asd){
String sourcestring = "source string to match with pattern";
Pattern re = Pattern.compile("^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher m = re.matcher(sourcestring);
int mIdx = 0;
while (m.find()){
for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
}
mIdx++;
}
}
}
匹配
这仅显示捕获组 1。捕获组 0 是整个匹配的字符串
$matches Array:
(
[1] => Array
(
[0] => Line number 1
Line number 2
Line number 3
Line number 4
[1] => Line number 1
Line number 2
Line number 3
Line number 4
[2] => Line number 1
Line number 2
[3] => Line number 1
Line number 2
)
)