我有一个像'a b b b a'这样的字符串,并希望替换该字符串中的每个'b',该字符串在具有不同字符的字符之前和之后具有空格。我怎么能用正则表达式做到这一点?我的想法是:
'x a y a x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x b y b x, should: x b y b x (correct)
'x a a a x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x b a b x, should: x b b b x (wrong)
'x aa x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x aa x, should: x aa x (correct)
但是,如果角色的另一个出现位置旁边出现的角色不超过1次,则该正则表达式才有效。我怎么能写正则表达式以获得正确的行为?
答案 0 :(得分:5)
在“a”之后使用前瞻来匹配重叠的子串:
df['quantile'] = 0.0
for q in [0.25, 0.5, 0.75]:
df.loc[df['value'] >= df['value'].quantile(q), 'quantile'] = q
或者,要匹配任何空格,请将空格替换为/ a(?= )/g
。
作为lookahead的zero-width assertion不会消耗文本,因此“a”之后的空格将可用于下一个匹配(模式中的第一个空格是消耗的一部分图案)。
请参阅regex demo
\s
答案 1 :(得分:3)
由于您的匹配重叠,您可以使用零宽度断言,即基于正则表达式的正向前瞻:
str = str.replace(/( )a(?= )/g, "\1b");
( )a
将匹配a
之前的空格,并在#1组中捕获,然后a
(?= )
会在a
之后声明存在空格,但在比赛中不会消耗它。答案 2 :(得分:0)
您可以将带有g
标记的RegExp与replace
方法一起使用。试试这个
var mystring = "this is a a a a a a test"
mystring.replace(/ a /g , "b");