【问题标题】:Split by words or operators with regular expressions使用正则表达式按单词或运算符拆分
【发布时间】:2016-09-09 21:25:01
【问题描述】:

如何拆分

-(ab | c) & d -> (d|c)&e f

放入数组

['-', '(', 'ab', '|', 'c', ')', '&', 'd', '->', '(', 'd', '|', 'c', ')', '&', 'e', '<->', 'f']

所以一般来说,它应该将字符串拆分为标记。如果两个字母组合成一个单词(例如ab),则应将其视为1个令牌。我有运算符-()|&amp;-&gt;&lt;-&gt;

可能是这样的

var str = '-(ab | c) & d -> (d|c)&e <-> f';
var regex = /([-&\|()]|\w+)/;
str.split(regex);

但不包括-&gt;&lt;-&gt;

【问题讨论】:

  • 好吧,你没有将它们包含在你的 reg exp 中......
  • 我知道。这是因为我不知道该怎么做。如果我只是将它们添加到[-&amp;\|,它也会只识别&lt;-&gt;。而且我只对它感兴趣以完全识别-&gt;&lt;-&gt;
  • 无效输入怎么样,例如-(ab | c) @@@ &amp; %%% d ?
  • 他们实际上应该被淘汰。我没有想到。实际上,它应该只允许字母组合 [A-Za-z]。所以偶数应该被淘汰..
  • @Jamgreen - 如果你不关心 anything 其他,你不应该使用 split。顺序,范围,嵌套,运算符优先级怎么样。这不是以任何理智的方式解析令牌的方法。你应该只匹配你需要的,忘记其余的。 -&gt;?|&lt;-&gt;|[()|&amp;]|[a-zA-Z]+

标签: javascript regex tokenize


【解决方案1】:

您可以使用此正则表达式进行拆分:

var str = '-(ab | c) & d -> (d|c)&e <-> f';
var arr = str.split(/\s*(<?->|[-&|()]|\w+)\s*/).filter(Boolean)

console.log(arr)
//=> ["-", "(", "ab", "|", "c", ")", "&", "d", "->", "(", "d", "|", "c", ")", "&", "e", "<->", "f"]

分手:

\s*         # match 0 or more spaces
(           # group spart
   <?->     # match <-> or ->
   |        # OR
   [-&|()]  # match one of these symbols
   |        # OR
   \w+      # match 1 or more word chars
)           # group end
\s*         # match 0 or more spaces

【讨论】:

    【解决方案2】:

    这个怎么样?

    var string = '-(ab | c) & d -> (d|c)&e <-> f';
        
    var result = string.match(/<->|->|[-()|&]|\w+/g);
    
    console.log(result);

    您可以利用[]| 运算符。见JavaScript regex on MDN

    【讨论】:

    • ()等在[...]内部并不特殊,无需转义
    【解决方案3】:

    您可以使用匹配的正则表达式,例如

    /<?->|[^\s\w]|\w+/g
    

    其中[^\s\w] 匹配任何非空格或非单词字符,假设字符串不包含垃圾,否则使用

    /<?->|[-()|&]|\w+/g
    

    查看regex demo 和下面的 JS 演示:

    var re = /<?->|[-()|&]|\w+/g;
    console.log("-(ab | c) & d -> (d|c)&e <-> f".match(re));

    模式详情

    • &lt;?-&gt; - 可选&lt; + -&gt;
    • | - 或
    • [^\s\w] - 除空格和字符以外的符号

    • [-()|&amp;] - 一个符号,-()|&amp;
    • | - 或
    • \w+ - 1 个或多个单词字符。

    带有带有全局修饰符的正则表达式的String#match 获取一个包含正则表达式可以在输入字符串中找到的所有匹配值的数组。

    【讨论】:

    • 使用匹配的方法,不需要额外应用.filter(Boolean)操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2017-10-03
    • 2012-09-24
    • 2011-05-30
    相关资源
    最近更新 更多