我已经做了一段时间了,但这超出了我对regex的理解。
我在RSS上使用雅虎管道,我想从标题中创建标签;所以,我想删除引号之间的所有空格,但是,如果引号中有冒号,我只想删除冒号之前单词之间的空格。
而且,如果我也能将无空格的单词作为一个组来捕获,能够使用:#$1一步输出标签,那就太好了。
所以,类似于:
"The New Apple: Worlds Within Worlds" Before We Begin...
可以像#$1一样被替换-结果是:
"#TheNewApple: Worlds Within Worlds" Before We Begin...
经过一些工作,我能够想出,这个正则表达式:
s(?=s)?|(‘|’|(Review)|:.*)
("Review"这个词经常出现在冒号之前,如果它出现在标题后面,就不会被删除;这就是为什么,但我不想要求它更通用)
但是,它有两个问题:
我必须使用多个步骤。正则表达式的结果是:
"TheNewApple: Worlds Within Worlds" Before We Begin...
然后我可以添加另一个regex步骤,将hash#放在前面
- 但是,只有当引号在第一位时,它才有效,我不知道如何解决这个问题
您可以使用regex一步完成这一切,但需要注意。重复捕获组会遇到问题,因为替换字符串中只有最后一次迭代可用。搜索( (w+))+
并替换为$2
会将所有单词替换为最后一个匹配项,而不是我们想要的。
解决这个问题的方法是重复该模式任意次数,这将足以满足您的使用。每个单独的组都可以被引用。
搜索:"(w+)(?: (w+))?(?: (w+))?(?: (w+))?(?: (w+))?(?: (w+))?
替换:"#$1$2$3$4$5$6
这将取代最多6个单词的标题,完全符合您的需要。首先,"(w+)
匹配引号后面的任何单词。在替换字符串中,它被放回"#$1
,并添加了hashtag。剩下的是(?: (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"
您可以将文本与进行匹配
"([^:]*)(.*?)"(.*)
然后使用一些编程语言输出这样的结果:
'"#' + removeSpace($1) + $2 + '"' + $3
我不知道您使用的是什么语言,但这似乎是regex的一个糟糕选择。在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)
对进行全局搜索
(?=.*:)
什么都没有替换。示例
如果你想把"TheNewApple"作为一个单词,你需要对搜索结果进行第二次搜索。