1

我有程序:

var str = "ac.def=1 and xy.z.kt='10' and k.t=1 or xy.z.kt.lm='10'";
var regex = new RegExp('^[a-zA-Z0-9,]*[.]{1}[^=]');
var result = str.split(" ").filter((elem, index) => {
    return regex.test(elem);
})

console.log(result);

我得到的结果为:["ac.def=1", "xy.z.kt='10'", "k.t=1", "xy.z.kt.lm='10'"]

但我只需要得到:["abc.def=1", "k.t=1"]


据说我的问题可能与学习正则表达式重复,所以让我们永远关闭 stackoverflow,因为所有关于软件编程的问题在他们自己的官方文档中都有答案。

将问题标记为可能是官方文件的副本时,请小心。否则我们应该关闭所有关于正则表达式的问题,因为学习正则表达式足以解决所有关于正则表达式的问题。对?

4

1 回答 1

3

您可以使用/^[^.]*\.[^.]*$/正则表达式:

var str = "ac.def=1 and xy.z.kt='10' and k.t=1 or xy.z.kt.lm='10'";
var regex = /^[^.]*\.[^.]*$/;
var result = str.split(" ").filter((elem, index) => {
    return regex.test(elem);
})

console.log(result);

图案细节

  • ^- 字符串的开始
  • [^.]*- 0+ 以外的字符.
  • \.- 一个点
  • [^.]*- 0+ 个字符
  • $- 字符串结束。

请参阅正则表达式演示

替代,单一正则表达式,解决方案

您可以使用单个正则表达式来收集匹配项,例如

/(?:^|\s)([^.\s]*\.[^.\s]*)(?!\S)/g

请参阅正则表达式演示

细节

  • (?:^|\s)- 匹配字符串或空格开头的非捕获组
  • ([^.\s]*\.[^.\s]*)- 捕获组 1:
    • [^.\s]*.- 除了 a和空格之外的 0+ 个字符
    • \.- 一个点
    • [^.\s]*.- 除了 a和空格之外的 0+ 个字符
  • (?!\S)- 当前位置右侧不允许出现非空白(空白或字符串结尾可以出现在右侧)

JS 演示:

var s = "ac.def=1 and xy.z.kt='10' and k.t=1 or xy.z.kt.lm='10'";
var results = [];
s.replace(/(?:^|\s)([^.\s]*\.[^.\s]*)(?!\S)/g, ($0, $1) => results.push($1));
console.log(results);

如果之前必须有一个点=,请使用

/^[^.=]*\.[^.=]*=/

在您的代码中。请参阅正则表达式演示。不同之处在于正则表达式不再$位于末尾,=因为它足以停止在那里检查,并且=将字符添加到否定字符类中以防止它们在这些符号之间匹配。

于 2019-02-14T11:05:20.733 回答