Javascript 正则表达式将开头和结尾的任何字符与特定字符串匹配

Javascript 正则表达式将开头和结尾的任何字符与特定字符串匹配,javascript,regex,Javascript,Regex,我有以下字符串: "bar foo test-line drop-line" 我需要替换以anything开头,以'-line'结尾的单词 基本上有: "bar foo new_word new_word" 我试过: string.replace(/\.-line$/g,'new_word') 但它不起作用。尝试将此作为正则表达式: /\S+-line(?![-\w])/ 由于破折号不被视为单词的一部分,因此单词anchor不适用于此处,因此/\S+-line\b/会错误地将文本与不被替

我有以下字符串:

"bar foo test-line drop-line"
我需要替换以anything开头,以'-line'结尾的单词

基本上有:

"bar foo new_word new_word"
我试过:

string.replace(/\.-line$/g,'new_word')
但它不起作用。

尝试将此作为正则表达式:

/\S+-line(?![-\w])/
由于破折号不被视为单词的一部分,因此单词anchor不适用于此处,因此
/\S+-line\b/
会错误地将
文本与不被替换的行匹配。因此,前瞻性结构

当然,根据您的用例,
\S
可能看起来有点粗糙。如果你的单词实际上只由字母、破折号等组成,那么你可以使用
normal*(special normal*)*
模式:

/[a-z]+(-[a-z]+)*-line(?![-\w])/i
(普通:
[a-z]
,特殊:
-

(编辑:由于@thg435,更改了前瞻结构)

尝试将此作为正则表达式:

/\S+-line(?![-\w])/
由于破折号不被视为单词的一部分,因此单词anchor不适用于此处,因此
/\S+-line\b/
会错误地将
文本与不被替换的行匹配。因此,前瞻性结构

当然,根据您的用例,
\S
可能看起来有点粗糙。如果你的单词实际上只由字母、破折号等组成,那么你可以使用
normal*(special normal*)*
模式:

/[a-z]+(-[a-z]+)*-line(?![-\w])/i
(普通:
[a-z]
,特殊:
-


(编辑:由于@thg435,更改了先行结构)

在正则表达式中,可以使用\b来检测新词的开头,\w来检测“单词字符”:


请参见正则表达式中的

,您可以使用\b来检测新词的开头,\w来检测“单词字符”:

请参见

string.replace(/\b\S+-line\b/g,'new_word')
\b
单词边界

\S
非空白

正如fge敏锐地指出的,我们需要一个
\b
之后,这样我们就不会捕捉到以
等结尾的东西,等等

怎么样

string.replace(/\b\S+-line\b/g,'new_word')
\b
单词边界

\S
非空白



正如fge敏锐地指出的,我们需要一个
\b
行之后
,这样我们就不会捕捉到以
行结尾的东西。。那不行嗯。。不起作用的将匹配
foo条线
,并将其替换为
foo-new\u单词
@user1600124尝试我在评论中提到的输入,然后see@fge添加了另一个单词边界。非常抱歉@Elronoco这里真正的问题是
\b
不能使用<代码>-
不被视为单词的一部分!OP想要的是以“任何东西”开头,以
-line
结尾的东西。在这里,我把“任何东西”的松散含义理解为“单词”字符——这对于OP的两个例子来说都是好的。诚然,它将无法匹配
-某些行
…将匹配
foo-bar行
,并用
foo-new\u单词
替换它@user1600124尝试我在评论中提到的输入,然后see@fge添加了另一个单词边界。非常抱歉@Elronoco这里真正的问题是
\b
不能使用<代码>-不被视为单词的一部分!OP想要的是以“任何东西”开头,以
-line
结尾的东西。在这里,我把“任何东西”的松散含义理解为“单词”字符——这对于OP的两个例子来说都是好的。诚然,它将无法匹配
-某行
…我将把前瞻写为
(?![-\w])
,以处理可能的标点。非常感谢。我只是不明白最后一部分(?![-\w])你能解释一下吗?多谢了,这是一个消极的展望。它的意思是“找到一个位置,使后面的不是破折号或文字字符”。一般的构造是
(?!…)
,其中
是一个正则表达式。我将前瞻写为
(?![-\w])
,以处理可能的标点符号。非常感谢。我只是不明白最后一部分(?![-\w])你能解释一下吗?多谢了,这是一个消极的展望。它的意思是“找到一个位置,使后面的不是破折号或文字字符”。一般构造是<代码>(……)>代码>,其中<代码>…>代码>是正则表达式。它只取决于您所考虑的是一个单词。如果你想包含负号,就这样做:“替换”(/\B\[-W++-Loe\b/g,'NeWiWord))这不是你认为单词边界的问题,而是ReGEX引擎考虑单词边界……@ FGE是正确的。w和\b一起出现。减号不是浏览器的单词字符,所以如果你想考虑减去你的模式中的单词字符,你就不能使用Word边界。让我重写正则表达式:“.replace(/[-\w]+-line(?=(\s |$))/g,“new_word”)。。。NB:最后一个部分意味着一个词可以用一个空格或字符串的结尾来结束,它只取决于你所考虑的是一个单词。如果你想包含负号,就这样做:“替换”(/\B\[-W++-Loe\b/g,'NeWiWord))这不是你认为单词边界的问题,而是ReGEX引擎考虑单词边界……@ FGE是正确的。w和\b一起出现。减号不是浏览器的单词字符,所以如果你想考虑减去你的模式中的单词字符,你就不能使用Word边界。让我重写正则表达式:“.replace(/[-\w]+-line(?=(\s |$))/g,“new_word”)。。。注意:最后一部分表示一个单词可以以空格或字符串结尾。