![Textmate:用正则表达式替换匹配项并保留大小写吗?](https://linux22.com/image/1294531/Textmate%EF%BC%9A%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9B%BF%E6%8D%A2%E5%8C%B9%E9%85%8D%E9%A1%B9%E5%B9%B6%E4%BF%9D%E7%95%99%E5%A4%A7%E5%B0%8F%E5%86%99%E5%90%97%EF%BC%9F.png)
如何使用单个搜索/替换来替换此句子中的所有单词town
并village
保留首字母的大小写:
Towns are small cities. I live in a town.
答案1
\b(?:(T)|t)own(s?)\b
→(?1:\u)village$2
(并在对话框中取消选中忽略大小写)
\b
= 字边界(?:)
= 非捕获组(?1:\u)
= 如果捕获组 1 则将下一个字符转换为大写
答案2
我现在正在使用工作电脑,所以这里没有 TextMate 可以让我测试,但我认为这可能做你想做的事:
Find: \b(T)?((?<!T)t)?(?<! )own(s)?\b
Replace: (?1:Village)(?2:village)$3
(请确保先取消勾选‘忽略大小写’。)
解释:
“查找”模式搜索以 a或 aown
开头的字母,然后分别将它们捕获到和。第二个捕获中的 确保你不会同时得到它们(例如一起),尽管这可能不太可能,并且 位表示前面不能有空格 - 这应该会阻止它单独匹配单词。两边的 表示它应该只匹配整个单词(否则它将匹配像和 这样的内容)。最后,部分捕获最后一个(如果存在)到。T
t
$1
$2
(?<!T)
Tt
(?<! )
own
own
\b
townies
chown
(s)?
s
$3
替换模式使用有条件插入确定用什么来替换文本。在伪代码中,替换字符串基本上是这样的:
if (the first capture [T] exists) { replace the text by the word Village }
if (the second capture [t] exists) { replace the text by the word village }
(然后它添加$3
,它要么为空,要么包含s
)
它很丑,但我认为无论如何它可能适用于你给出的例子。