正则表达式在两个分隔符之间找到最内部的字符串

时间:2013-07-30 19:25:53

标签: regex

我正在使用 TextCrawler * regxp *来对齐现有的纯文本文件。 文件内的文本是连续的,没有换行符 .... moredata ....

演员名单

Amy Brenneman, Aaron Eckhart, Catherine Keener, Natassja Kinski
, Jason Patric, Ben Stiller,

发布的电影

Gladiator,Matrix Reloaded,The Shawshank Redemption,Pirates of the Caribbean 
- Curse of the Black Pearl,Monsters Inc,

类型

SciFi,Romance,Drama,Action,Comedy,Advenure,Animated,Western,Horror  

.... .... MOREDATA

我试图找到逗号和冒号之间的字符串,并用相同的字符串替换,但在找到的模式之前添加了新行。 我试过跟随,但它匹配字符串形式最外面的逗号到冒号。

[,]{1}.[A-Z].*[:]

有什么想法吗?哪里出错了?

2 个答案:

答案 0 :(得分:1)

为什么不使用这种模式:

search:   (?<=,)[^,:]+(?=:)
replace:  \n$0

模式细节:

(?<=,)  # lookbehind assertion: only a check that means "preceded by ,"
[^,:]+  # negated char class: all characters except , and :
(?=:)   # lookahead assertion: only a check that means "followed by :"

Lookarounds只是可以使模式失败或成功的测试,它们不是匹配结果的一部分。

答案 1 :(得分:1)

下面提到的模式有效:

搜索模式:(,?[^:,] +:)
替换字符串: \ n \ 1 \ n

例如:

给定一个包含内容的文件a.txt:

演员名单:A,B,C,发行的电影:D,E,F,类型:G,H,I

perl -pe "s@(,?[^:,]+:)@\n\1\n@g" a.txt

上述命令产生以下格式的输出:

演员名单:
A,B,C
,电影发布:
d,E,F
,流派:
G,H,I

我希望上面的输出符合您的期望。