我如何写一个Qt正则表达式来突出显示字符串开始和结束与非单词字符

How do I write a Qt regular expression to highlight strings starting and ending with non-word characters?

本文关键字:开始 字符串 结束 字符 单词 显示 何写一 Qt 正则表达式      更新时间:2023-10-16

Windows 7 SP1
2010 msv
Qt 4.8.4

我想突出显示任何以1个或多个连字符开头和/或以1个或多个连字符结尾的字符串(不是单词)。字符串可能包含Unicode,所以我需要处理字符集。

例如,这些应该突出显示(但不包括周围的空白):

-word --word -&#$$ --&#$$ 
word- word-- &a$$- &a$$--
-word- --word-- -&a$$- --&a$$-- 
-word-word- --word--word--

没有外部连字符的内嵌连字符字符串不应高亮显示:

word-word word--word &#$$-&#$$ &#$$--&#$$

连字符不应该突出显示:

------- ---- -- ----

:

1. QRegExp("-+[\S]+|[\S]+-+")

选择我想要突出显示的所有内容(不突出显示周围的空白),但也选择我不想突出显示的内容:连字符字符串和嵌入的连字符字符串的第一部分(下划线):

word-word
-----

我相信这不会选择连字符字符串:

2. QRegExp("-+[\S]-[-]]+|[\S-[-]]+-+")

但我不知道Qt是否支持字符类减法;此表达式没有选择任何内容。

所以,我的想法是创建单独的规则,随后取消突出显示这些字符串。

选择连字符字符串(然后取消高亮显示):

3. QRegExp("[\s-+(?=\s)|\s-+$|^-+(?=\s)|^-+$"")

我被困在如何处理嵌入的连字符字符串。我认为向后看断言会有帮助,但是它们不被支持。

我的问题: a)是否有一种简单的方法来选择嵌入的连字符字符串的第一部分,这样我就可以取消突出显示而不选择其他任何东西(没有其他副作用)?或者b)最好的情况是,在表达式1中是否有更好的方法来实现这一点。实现我所有的目标而又不突出吗?

如果要匹配一个或多个-,然后至少一个非空格非连字符,然后再匹配一个或多个-,则使用QRegExp("-+[^-\s]+-+")代替QRegExp("-+[\S]+|[\S]+-+")

S匹配任何非空格字符,包括连字符,这使得只有连字符的序列有效,因为---有一个连字符匹配第一个-+,一个连字符匹配S+,另一个连字符匹配最后一个-+