繁体   English   中英

RegExp在JSFiddle中工作,但不在nodejs中工作

[英]RegExp working in JSFiddle but not in nodejs

我有正则表达式:

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

它匹配诸如!!some text!!(zoomOn 1,2,3)类的东西!!some text!!(zoomOn 1,2,3)

这在浏览器( 此处为JSFiddle )中可以正常运行,但在Node中则不能。 我正在使用Babel和es2015预设ES2015中编写

为了获得更多的见解,这是针对Showdown扩展程序的。 我注意到twitter扩展为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);
    });
  });
});

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

如果我像下面那样做一些简单的事情,它将起作用。 当然,单元测试不工作,但如果我CONSOLE.LOG出来,然后我得到预期的结果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;
    },
  },
];

在Node中对我有效,只是尝试了一下,但是该小提琴使用了alert()。 您需要使用Node可以理解的类似console.log()的东西。

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

也许您还有其他未发布的代码正在干扰您?

这很尴尬,但是是检查所有已学习的函数的一课。 这些行中调用的normalize()函数:

const markdown = normalize(fs.readFileSync(`${__dirname}/extensions/Kaavio.md`, 'utf8'));

const HTML = normalize(fs.readFileSync(`${__dirname}/extensions/Kaavio.html`, 'utf8'));

用项目符号字符替换了空格...无论如何都感谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM