我有一个需要分隔的大文本。
STARTING
....
TEXT
....
END
STARTING
....
TEXT
....
END
我想要分隔的所有e开头和结尾都是相同的字符。但我只想在开始和结束之间获取文本,ID: 10
出现。样品:
STARTING
....
TEXT
....
END
STARTING
....
TEXT
ID: 10
....
END
欲望结果:
STARTING
....
TEXT
ID: 10
....
END
所以,我做了这个正则表达式:
START[\s\S]*?ID:\s15[\s\S]*?END
问题是:匹配是在获取文本之前,应该得到:
START
ID: 15
END
获得:
START
ID: 13
END
START
ID: 15
END
是否可以在比赛前获得第一个START
?
谢谢!
答案 0 :(得分:0)
"回火"带有[\s\S]
前瞻的(?!START)
模式:
START(?:(?!START)[\s\S])*?ID:\s15[\s\S]*?END
请参阅regex demo
(?:(?!START)[\s\S])*?
将匹配任何字符([\s\S]
),0或更多次出现,但尽可能少,但未启动START
序列。
懒惰的*?
量词可以变成贪婪的量词,但是你需要在前瞻中添加更多的替代词:
START(?:(?!START|END|ID:\s15)[\s\S])*ID:\s15[\s\S]*?END
答案 1 :(得分:0)
模式[\s\S]
没有意义,它等同于.
:
\s
- 空白\S
- 非空白[\s\S]
- 空白或非空白,所以一切基本上等同于.
。您可能需要的是简单的正则表达式:
/START\s+ID:\s+15\s+END/gm
...这与您的单个“记录”匹配,ID为15。
但是你也说你有“(...)一个你想要划分的巨大文本(...)”。这与您的以下示例相矛盾。如果你想获得你可能需要的每条记录,请尝试使用:
/START\s+ID:\s+(\d)+\s+END/gm