正则表达式将所有文本更改为小写,但省略以特定方式开始和结束的文本部分

Regex to change all text to lowercase but leave out parts of text that start and end in a specific way

提问人:Antidisestablishmentarianism 提问时间:11/16/2018 最后编辑:Antidisestablishmentarianism 更新时间:11/16/2018 访问量:49

问:

有没有办法将所有文本更改为小写,但以特定字母组合(“ABC”)开头并以空格结尾的单词除外(点、连字符、下划线可以在其中? 保留“ABCkjkJ.90_1”或“ABC-12_OLL”等单词的大写字母,但其他所有内容都小写?

找到:

(我不知道)

[^ABC][\s]$ 

替换为:

\L$1

另外,我应该如何从文本的其余部分(而不是以 ABC 开头的标点符号)中删除所有标点符号?

与正则表达式 语言无关

评论

0赞 Wiktor Stribiżew 11/16/2018
正则表达式与语言无关。 许多正则表达式库不支持其他大小写更改运算符。此任务可能需要的其他功能可能因正则表达式库而异。\L

答:

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
不应尝试匹配单词字符,而应仅匹配字符集中要删除的标点符号。例如,删除所有点、下划线和破折号[._-]