匹配单词和句号,但不匹配结尾的句号

时间:2018-07-06 08:38:48

标签: javascript regex

我正在尝试匹配类型为$word1.word2.word3的字符串,该字符串内部包含点,但不应以点结尾。

换句话说:

$context.abc.value$context.abc.value.random()-应匹配完整字符串

$context.abc.value.-应该匹配除最后一个字符(点)以外的所有内容。

我的正则表达式现在是:

(?:^|\s)\$(?!\d)[\w.\[\]\(\)]+

以下是玩弄的小提琴:https://regex101.com/r/PxCtUv/1

如何避免匹配尾随点字符?

3 个答案:

答案 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()' ]