javascript正则表达式 - 看看替代方案?

时间:2011-09-11 04:06:13

标签: javascript regex

这是一个在大多数正则表达式实现中都能正常运行的正则表达式:

(?<!filename)\.js$

这匹配.js为一个以.js结尾的字符串,除了filename.js

Javascript没有正则表达式。有没有人能够组合一个替代正则表达式,它可以实现相同的结果,并且可以在javascript中运行?

以下是一些想法,但需要辅助功能。我希望用正则表达式实现它: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

6 个答案:

答案 0 :(得分:142)

编辑:从2018年ECMAScript开始,lookbehind assertions (even unbounded) are supported natively

在以前的版本中,您可以这样做:

^(?:(?!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

答案 1 :(得分:60)

^(?!filename).+\.js适合我

测试:

  • test.js match
  • blabla.js匹配
  • filename.js不匹配

可以在Regular expression to match string not containing a word?

找到此正则表达式的正确解释

version 1.5 of javascript开始向前看,并且所有主流浏览器都支持

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

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

答案 2 :(得分:22)

假设您要查找int之前没有的所有unsigned

支持负面观察:

(?<!unsigned )int

不支持负面观察:

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

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

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

(?<!filename)\.js$

会转换为:

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

您可能需要使用捕获组来查找您感兴趣的字符串的确切位置,或者您不想用其他内容替换特定部分。

答案 3 :(得分:5)

如果你可以向前看但是回来,你可以先扭转字符串然后再做一个预测。当然,还需要做更多的工作。

答案 4 :(得分:0)

这是Tim Pietzcker's answer的等效解决方案(另见相同答案的评论):

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

表示匹配除*.js以外的*filename.js

要获得此解决方案,您可以检查负面外观排除哪些模式,然后使用否定前瞻精确排除这些模式。

答案 5 :(得分:-1)

以下是一个积极的后视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)    ));