我正在尝试匹配类型为$word1.word2.word3
的字符串,该字符串内部包含点,但不应以点结尾。
换句话说:
$context.abc.value
,$context.abc.value.random()
-应匹配完整字符串
$context.abc.value.
-应该匹配除最后一个字符(点)以外的所有内容。
我的正则表达式现在是:
(?:^|\s)\$(?!\d)[\w.\[\]\(\)]+
以下是玩弄的小提琴:https://regex101.com/r/PxCtUv/1
如何避免匹配尾随点字符?
答案 0 :(得分:6)
您可以将最后一个[a.]+
模式“分解”为[a.]*[a]
:
(?:^|\s)\$(?!\d)[\w.[\]()]*[\w[\]()]
^^^^^^^^^^^^^^^^^^^^
请参见regex demo。
详细信息
(?:^|\s)
-与字符串(^
)或(|
)空格(\s
)匹配的非捕获组\$
-一个$
字符(?!\d)
-如果$
字符后面有一个数字,则负匹配将使匹配失败。[\w.[\]()]*
-零个或多个单词,.
,[
,]
,(
或)
字符[\w[\]()]
-一个单词,.
,[
,]
,(
或)
字符。答案 1 :(得分:2)
使用以下内容:
\$(?!\d)[\w]+([.]{0,1}[\w()]+)+
您可以通过以下方式尝试:https://regex101.com/r/2ONUHj/1
$
符号前的空白不匹配。.
可能还有很多其他未定义的极端情况。
有关更多详细信息,请使用https://regexr.com/上的说明。
答案 2 :(得分:0)
如果愿意,您可以不使用正则表达式来做到这一点
const data = [
'context.abc.value',
'$context.abc.value.random()',
'$context.abc.value.'
];
const filtered = data.filter(item => Array.from(item).pop() !== '.');
// [ 'context.abc.value', '$context.abc.value.random()' ]