提问人:Antidisestablishmentarianism 提问时间:11/16/2018 最后编辑:Antidisestablishmentarianism 更新时间:11/16/2018 访问量:49
正则表达式将所有文本更改为小写,但省略以特定方式开始和结束的文本部分
Regex to change all text to lowercase but leave out parts of text that start and end in a specific way
问:
有没有办法将所有文本更改为小写,但以特定字母组合(“ABC”)开头并以空格结尾的单词除外(点、连字符、下划线可以在其中? 保留“ABCkjkJ.90_1”或“ABC-12_OLL”等单词的大写字母,但其他所有内容都小写?
找到:
(我不知道)
[^ABC][\s]$
替换为:
\L$1
另外,我应该如何从文本的其余部分(而不是以 ABC 开头的标点符号)中删除所有标点符号?
答:
1赞
CertainPerformance
11/16/2018
#1
问题归结为匹配的单词不是以 . 开头的。由于字符串中的单词可以包含点和连字符,而这些点和连字符不是单词字符,因此我们不能用于确定单词的开头,因此,不幸的是,请将前面的空格(或字符串的开头)与ABC
\b
(?: |^)
然后否定 lookahead for ,并匹配尽可能多的单词、点或连字符:abc
(?: |^)(?!abc)[\w.-]*
然后,每个完整匹配项都小写。
https://regex101.com/r/QSShDu/1
示例,对于输入:
Baz Buzz ABCkjkJ.90_1 ABC-12_OLL Foo Bar
你得到
baz buzz ABCkjkJ.90_1 ABC-12_OLL foo bar
如果该部分总是出现在字符串的开头,那么它就容易得多 - 只需捕获组中的第一个单词,然后捕获组中字符串的其余部分,并将字符串的其余部分大写:ABC
([\w.-]*)(.+)
替换为
\1\L\2
https://regex101.com/r/QSShDu/2
评论
0赞
Antidisestablishmentarianism
11/16/2018
谢谢!如果这很重要,“ABC***”字符串始终位于行的开头。每行总是以“ABC”和需要保持其大小写的乱码字符开头,但该行的其余部分包含需要小写的文本。
0赞
Antidisestablishmentarianism
11/16/2018
非常感谢!最后一件事,如果我不是太无礼:我如何从字符串的其余部分删除除撇号之外的所有标点符号?替换 - sth like ([\w.-]*)(\W\S)?我该用什么代替它?
0赞
CertainPerformance
11/16/2018
将要删除的每个标点符号放入字符集中,然后将每个出现的字符替换为空字符串。例如[._-]
0赞
Antidisestablishmentarianism
11/16/2018
我决定忘记撇号。tried ([\w.-]*)([[:p unct:]]) 替换为 \1[._-]\2。那没有用
0赞
CertainPerformance
11/16/2018
不应尝试匹配单词字符,而应仅匹配字符集中要删除的标点符号。例如,删除所有点、下划线和破折号[._-]
上一个:正则表达式的计算复杂度
评论
\L