javascript正则表达式-寻找替代方案吗?

2020/11/15 20:22 · javascript ·  · 0评论

这是一个可在大多数正则表达式实现中正常工作的正则表达式:

(?<!filename)\.js$

这与.js匹配以.js结尾的字符串,但filename.js除外

Javascript没有后面的正则表达式。有谁能放一个替代的正则表达式来达到相同的结果并可以在javascript中工作?

这里有一些想法,但需要帮助功能。我希望仅通过正则表达式来实现它:http :
//blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

^(?!filename).+\.js 为我工作

经过测试:

  • test.js匹配
  • blabla.js比赛
  • filename.js不匹配

可以在则表达式中找到此正则表达式的正确解释,以匹配不包含单词的字符串?

JavaScript版本1.5开始,可以使用“向前看”功能并且所有主要浏览器都支持“向前看”功能

更新以匹配filename2.js和2filename.js,但不匹配filename.js

(^(?!filename\.js$).).+\.js

编辑:从ECMAScript 2018起,原生支持向后断言(甚至是无界的)

在以前的版本中,您可以执行以下操作:

^(?:(?!filename\.js$).)*\.js$

这显式地做了lookbehind表达式的隐式操作:检查字符串中的每个字符,如果lookbehind表达式加上后的正则表达式不匹配,则仅允许该字符匹配。

^                 # Start of string
(?:               # Try to match the following:
 (?!              # First assert that we can't match the following:
  filename\.js    # filename.js 
  $               # and end-of-string
 )                # End of negative lookahead
 .                # Match any character
)*                # Repeat as needed
\.js              # Match .js
$                 # End of string

另一个编辑:

我很难说(特别是因为这个答案已经被否决了),有一种简单得多的方法可以实现这个目标。无需检查每个字符的前瞻性:

^(?!.*filename\.js$).*\.js$

一样好:

^                 # Start of string
(?!               # Assert that we can't match the following:
 .*               # any string, 
  filename\.js    # followed by filename.js
  $               # and end-of-string
)                 # End of negative lookahead
.*                # Match any string
\.js              # Match .js
$                 # End of string

假设您想查找所有int不以unsigned

支持负向后看:

(?<!unsigned )int

不支持负面的后顾之忧:

((?!unsigned ).{9}|^.{0,8})int

基本上,想法是抓住n个前面的字符,并排除具有负前瞻性的匹配,但也要匹配没有前面n个字符的情况。(其中n是向后看的长度)。

所以有问题的正则表达式:

(?<!filename)\.js$

将转换为:

((?!filename).{8}|^.{0,7})\.js$

您可能需要与捕获组一起使用,以找到您感兴趣的字符串的确切位置,或者您不想用其他东西替换特定部分。

如果可以向前看但可以向后看,则可以先反转字符串,然后再进行前瞻。当然,还需要做更多的工作。

这是Tim Pietzcker答案的等效解决方案(另请参见相同答案的注释):

^(?!.*filename\.js$).*\.js$

这意味着,*.js除之外,要匹配*filename.js

要获得此解决方案,您可以检查负向后看排除了哪些模式,然后使用负向前瞻来完全排除这些模式。

下面是一个正面的JavaScript替代方法,它显示了如何捕获以“ Michael”为姓氏的人的姓氏。

1)鉴于此案文:

const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";

获取姓名为Michael的人的姓氏数组。结果应为:["Jordan","Johnson","Green","Wood"]

2)解决方案:

function getMichaelLastName2(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(person.indexOf(' ')+1));
}

// or even
    .map(person => person.slice(8)); // since we know the length of "Michael "

3)检查解决方案

console.log(JSON.stringify(    getMichaelLastName(exampleText)    ));
// ["Jordan","Johnson","Green","Wood"]

此处的演示:http : //codepen.io/PiotrBerebecki/pen/GjwRoo

您也可以通过运行以下代码段进行尝试。

const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";



function getMichaelLastName(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(8));
}

console.log(JSON.stringify(    getMichaelLastName(inputText)    ));
本文地址:http://javascript.askforanswer.com/javascriptzhengzebiaodashi-xunzhaotidaifanganma.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!