正则表达式 - 只允许在匹配后跟一个空格或没有任何字符

23

嗨,我对正则表达式不是很熟悉...所以,也许我的问题很简单,但我找不到解决方案!

我正在编写一个正则表达式模式,它查找用户的输入并将匹配项着色为另一种颜色。 例如,如果用户输入类似以下内容,我想用另一种颜色着色:

foo()

问题是我不想在用户在那之后输入其他内容时再次修改它。我的意思是,如果用户只输入

"foo()" (or "foo() ")

那就好,我想要涂上颜色,但如果用户写了

"foo()d" 

我不想修改那段代码因为它对我来说已经很好了。

我已经编写了正则表达式模式来匹配“foo()”(或者中间带有点的形式,比如“foo.foo()”),但是我遇到了问题。我需要在我的模式中添加一些内容,以允许只有一个空格或者什么也没有(如果用户在“)”后面输入其他内容,我不想匹配它)。这是我的模式:

[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)

非常感谢!


1
不是很清楚你的问题。后面还有其他字符吗?如果没有,你可以在正则表达式结尾加上\s?$ - Ade Stringer
对,这样不行,因为我想让用户继续写作... - gezequiel
5个回答

20

David Brabant已经很接近,但我认为你实际上想要尝试在正则表达式结尾处使用(?!\S) - 这意味着你将匹配任何后面不跟随非空白字符的内容。如果您只想匹配空格而不是空白字符,请使用(?![^ ])


由于您是正则表达式的新手,您可能还不知道 ^ 和 $ 符号。它们是行锚点。例如,如果您的正则表达式是 "^foo()[ ]?$",它将仅匹配整行中的 "foo()" 和 "foo() "。 - Scen

6

使用负向先行断言:

(\w+)(\.*)(\(\))+(\s)*(?!.)

你在上面的正则表达式中需要注意的是:(\s)*(?!.)
(\s)* :后面跟着0个或多个空格 (?!.) :没有其他字符

@gezequiel:请看我的上一条评论。你需要对此进行微小的调整。 - James Johnson
是的...但是如果您在此正则表达式之后开始编写其他内容,则它将无效。 我的意思是,我希望用户可以像这样编写一些内容: something()和somethingElse() 并绘制这两个句子。 - gezequiel

1
[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)[ ]?

加上 [ ]? 就可以了。 ? 用于匹配 10[ ] 只匹配空格。

此外,[\s]? 可以匹配所有类型的空白字符(包括制表符)。


这样做不行,因为如果下一个字符不是空格,它将会匹配零次空格。我认为Gezequiel想要在匹配\S即非空白字符时失败。 - Ade Stringer
啊,谢谢 Ade,我应该更仔细地阅读问题。 - Scen

1

你能试着添加:

\s*% ?

\s*:零个或多个空格

% 表示:字符串结尾


0

根据我的正则表达式测试器,这似乎可以实现您所寻找的功能:

[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)([ ]?)(?!.)

如果你想允许多个空格,可以使用以下方法:
[a-z]*\.?[a-z]*\(("[^"\r\n]*"|[-]?\b\d+[\.]?\d*\b)?\)([ ]*)(?!.)

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