我有以下文字:
:10A: <any characters here>\r\n
<any characters here>\r\n
<any characters here>\r\n
.
.
.
:11A: or :12P:
两个“:XXX:”符号之间最多可以有10行(包括第一行)。 我需要提取(仅使用REGEX,没有Java方法)前一行到四行(包括第一行,不带“:10A:”)。
示例1:
:10A: Line number 1\r\n
Line number 2\r\n
Line number 3\r\n
Line number 4\r\n
Line number 5\r\n
Line number 6\r\n
:11A:
将提取:
Line number 1\r\n
Line number 2\r\n
Line number 3\r\n
Line number 4\r\n
示例2:
:10A: Line number 1\r\n
Line number 2\r\n
:12P:
将提取:
Line number 1\r\n
Line number 2\r\n
非常感谢任何帮助。
感谢。
答案 0 :(得分:1)
您可以使用此正则表达式
(?<=:.{3}:)(.*?(\\r?\\n)){1,4}
答案 1 :(得分:1)
此表达式将捕获每个部分的前4行文本。
^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})
^:[^:]*:
匹配分节符.*?
匹配与分节符相同的行上的文字(?
此捕获组将匹配整个行,而不是分节符
^
匹配行的开头(?:(?!^:[^:]*:|[\r\n]|\Z).)*
匹配该行上的所有字符,前提是它们不是章节标题,新行字符或字符串结尾[\r\n\Z]*
匹配任意数量的新行字符或字符串结尾){3}
尝试匹配其中三条线。请注意,内部条件是自动限制的,并且会阻止捕获更多行,然后一个部分可能包含。输入文字
: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
)
)
答案 2 :(得分:0)
开始时可能是正则表达式:
:(?:.*?):((?:.*?[\r\n]){1,4})(?:.*?):(?:.*?):
第一个匹配组最多会返回四行文本。
重要说明:您必须在Pattern.compile(pStr, Pattern.DOTALL)
或类似选项中打开Java中的“dotall”选项(Perl中的单行模式/.../s
或{{ 1)}在.NET中,否则正则表达式将无法工作,因为您正在处理多行数据。