RegExp在JSFiddle中工作,但在nodejs中没有

时间:2017-04-07 17:14:12

标签: javascript node.js regex babeljs

我有正则表达式:

/(?:!!)(.+)(?:!!)(?:\(zoomOn )([\S,]+)(?:\))/g

匹配!!some text!!(zoomOn 1,2,3)

之类的内容

这在浏览器(JSFiddle here)中可以正常工作,但在Node中没有。我正在使用Babel和es2015 preset在ES2015中写作。

对于额外的洞察力,这是Showdown扩展。我注意到twitter extension为RegExps添加了一些额外的\。这是Node / ES5的一个怪癖,我不知道吗?

更新

我希望我不需要发布Node的代码,因为我认为它只是一个节点怪癖。

无论如何,代码是Showdown的扩展名:

# extensions.js
export const manipulationAPIExtensions = () => [
  {
    // [zoomOn node1,node2,node3,...](some text)
    type: 'lang',
    filter: (text, converter, options) => {
      const toReturn = text.replace(/(?:!!)(.+)(?:!!)(?:\(zoomOn )([\S,]+)(?:\))/g, (match, innerText, nodeString) => {
        const nodes = nodeString.split(/\s*,\s*/);
        let nodeArrayAsString = '[';
        nodes.forEach(node => {
          nodeArrayAsString += `'${node}',`;
        });
        nodeArrayAsString += ']';
        return `<a onclick="pathwayInstance.manipulator.zoomOn(${nodeArrayAsString})">${text}</a>`;
      });
      return toReturn;
    },
  },
];

这在Showdown中使用如下:

export const getShowdown = (KaavioInstance) => {
  window.diagram = KaavioInstance;
  Showdown.extension('kaavio', manipulationAPIExtensions());
  return new Showdown.Converter({
    extensions: ['kaavio'],
  });
};

然后在我的单元测试中:

describe('CustomMarkdown', () => {
  // Don't really need Kaavio since we are only checking the output HTML
  const mockKaavioInstance = {};
  const converter = getShowdown(mockKaavioInstance);
  console.log(converter.getAllExtensions())

  describe('Kaavio', () => {
    it('should return the correct HTML from the markdown', () => {
      const markdown = normalize(fs.readFileSync(`${__dirname}/extensions/Kaavio.md`, 'utf8'));
      const HTML = normalize(fs.readFileSync(`${__dirname}/extensions/Kaavio.html`, 'utf8'));

      const output = converter.makeHtml(markdown);

      assert.equal(output, HTML);
    });
  });
});

由于未找到匹配项,因此单元测试失败。

如果我做一些像下面这样简单的事情就行了。当然单元测试不起作用,但是如果我调试它。记录它然后我得到matched的预期结果。

# extensions.js
export const manipulationAPIExtensions = () => [
  {
    // [zoomOn node1,node2,node3,...](some text)
    type: 'lang',
    filter: (text, converter, options) => {
      const toReturn = text.replace(/./g, (match) => {
        return 'matched';
      });
      return toReturn;
    },
  },
];

2 个答案:

答案 0 :(得分:0)

这对我在Node中有用,只是尝试过,但是这个小提琴使用了一个alert()。您需要使用Node理解的console.log()之类的东西。

var text = '!!some text!!(zoomOn node1)';
text.replace(/(?:!!)(.+)(?:!!)(?:\(zoomOn )([\S,]+)(?:\))/g, function (match, innerText, nodeString) {
    console.log("matched!");
})

也许你还有其他一些你没有发布过干扰的代码?

答案 1 :(得分:0)

这是令人尴尬的,但是在检查所学习的所有被调用函数方面的一课。在这些行中调用的cancel函数:

normalize()

正在用子弹字符替换白色空格......无论如何,感谢您的帮助!