正则表达式:匹配单词的最后一个字符

5

我试图匹配一个单词的最后一个字符。

一个单词是一串非空格字符 '[^\n\r\t\f ]',或者是一个空行 ^$。

我写了一个正则表达式来实现这个功能: "[^ \n\t\r\f]\(?:[ \$\n\t\r\f]\)"

这个正则表达式匹配紧跟着空格字符或行尾的非空格字符。

但我不知道如何防止它从结果中排除以下空格字符,并且为什么似乎无法捕获行尾之前的字符。

使用字符串“Hi World!”,我期望捕获:“i”和“!”。

但实际上我得到的是:“i ”。

我该怎么解决这个问题?


1
问题:你打算如何匹配空行?最后一个字符是什么? - Mad Physicist
你使用哪种正则表达式?是否需要捕获组,还是必须全部匹配或不匹配? - Mad Physicist
它可以跳到空行的开头,也可以跳过空行。我对这种行为并不是特别关注。对我来说,捕获组很重要。我正在使用elisp正则表达式风格。 - Aquaactress
2个回答

7

“单词”是由非空白字符序列组成的情况

请注意,在[^ \n\t\r\f](?:[\$\n\t\r\f])中,非捕获组(?:...)仍然匹配(消耗)空格字符(因此,它成为匹配的一部分),并且它不会在字符串末尾匹配,因为$符号不是字符类内的字符串结束锚定符,而是被解析为字面意义上的$符号。

您可以使用

\S(?!\S)

请查看正则表达式演示

\S匹配一个非空白字符,该字符后面没有跟随非空白字符(由于(?!\S)负向先行断言)。

一般的“单词”情况

如果一个单词仅包含字母、数字和下划线,也就是与\w+匹配,你可以简单地使用

\w\b

这里的\w匹配一个"单词"字符,并且单词边界断言后面没有单词字符。
请参见另一个正则表达式演示

如何匹配并替换任何单词的最后一个字符? - Jnanaranjan
我实际上需要这个[https://regex101.com/r/cL0gU8/7],但是第一个字符应该变成最后一个。 - Jnanaranjan
1
@Jnanaranjan 然后使用 ([a-zA-Z"])(?!\S),请参见 演示 - Wiktor Stribiżew

-1
在 Word 文本中,如果我想要突出段落中的最后一个 a,我会搜索所有具有 [空格] [段落] [空格] 的单词,以确保我只有我想要的单词,然后当找到它时,应该将其突出显示。 接下来,我会在所选内容中搜索最后添加的 [a ] 空格,并且我只会得到最后一个 [a],然后我会将其突出显示或以不同的颜色标记。

你是否认为OP在谈论办公软件Word? - klutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接