我已经在这方面工作了一段时间,但这超出了我对正则表达式的理解。
我在RSS上使用Yahoo Pipes,我想从标题创建主题标签;所以,我想从引号之间的所有内容中删除空格,但是,如果引号中有冒号,我只想在冒号前的单词之间删除空格。
而且,如果我还可以将不间隔的单词作为一个组捕获,那将是很好的,以便能够使用:#$ 1一步输出#标签。
所以,比如:
"The New Apple: Worlds Within Worlds" Before We Begin...
可以替换为#$ 1 - 使用此结果:
"#TheNewApple: Worlds Within Worlds" Before We Begin...
经过一番工作,我能够想出这个正则表达式:
\s(?=\s)?|(‘|’|(Review)|:.*)
("评论"这个词经常出现在冒号之前,如果它在标题的后面,则不会被剥夺;那是什么' s for,但我想不要求,更加普遍)
但是,它有两个问题:
我必须使用多个步骤。正则表达式的结果将是:
"TheNewApple: Worlds Within Worlds" Before We Begin...
然后我可以添加另一个正则表达式步骤,将哈希#放在前面
答案 0 :(得分:1)
您可以将文字与
匹配"([^:]*)(.*?)"(.*)
然后使用一些编程语言输出如下结果:
'"#' + removeSpace($1) + $2 + '"' + $3
答案 1 :(得分:1)
我不知道你正在使用什么语言,但这对于正则表达式来说似乎是一个糟糕的选择。在Python中我会这样做:
# Python 3
import re
titles = ['''"The New Apple: Worlds Within Worlds" Before We Begin...''',
'''"Made Up Title: For Example Only" So We Can Continue...''']
hashtagged_titles = list()
for title in titles:
hashtagme, *restofstring = title.split(":")
hashtag = '"#'+hashtagme[1:].translate(str.maketrans('', '', " "))
result = "{}:{}".format(hashtag, restofstring)
hashtagged_titles.append(result)
答案 2 :(得分:1)
答案 3 :(得分:1)
您可以使用正则表达式一步一步完成此操作,但需要注意。您遇到重复捕获组的问题,因为只有最后一次迭代在替换字符串中可用。搜索( (\w+))+
并替换为$2
会将所有替换为最后一场匹配 - 而不是我们想要的。
解决这个问题的方法是重复模式任意次数,以满足您的使用需求。可以引用每个单独的组。
搜索:"(\w+)(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?(?: (\w+))?
替换:"#$1$2$3$4$5$6
这将取代最多6个字的标题,完全按照您的需要。首先,"(\w+)
匹配引用后的任何单词。在替换字符串中,将其添加为"#$1
,添加主题标签。其余的是(?: (\w+))?
个匹配的重复列表,每个匹配可能的空格和单词。请注意,该空间是非捕获组的一部分;只有这个词是内部捕获组的一部分。在替换字符串中,我有$1$2$3$4$5$6
,它放回单词,没有空格。请注意,冒号不会匹配任何部分,因此一旦它到达冒号就会停止。
示例:
"The New Apple: Worlds Within Worlds" Before We Begin...
"The New Apple" Before We Begin...
"One: Two"
only "One" word
this has "Two Words"
"The Great Big Apple Dumpling"
"The Great Big Apple Dumpling Again: Part 2"
结果:
"#TheNewApple: Worlds Within Worlds" Before We Begin...
"#TheNewApple" Before We Begin...
"#One: Two"
only "#One" word
this has "#TwoWords"
"#TheGreatBigAppleDumpling"
"#TheGreatBigAppleDumplingAgain: Part 2"