在本教程中,我们将清除Java中正则表达式的整个概念。将深入探讨正则表达式的概念
的JavaScript中的正则表达式
在JavaScript中,正则表达式是一个模式和一些标志的构建。这些标志只是影响结果显示方式的一些设置,它们都是布尔值,因此我们只需要根据需要打开和关闭它们即可。模式是发生真正有趣的事情的地方–在这里我们可以定义一些非常复杂而强大的湖北福彩串搜索。但是,在此之前,我将先介绍一下正则表达式在JavaScript中可使用的上下文。
与该语言中的所有内容一样,我们有一个对象:称为RegExp。我们可以通过两种方式创建一个:
- 正则表达式文字
var query = / pattern / flags; 两者之间的一切“ /以“ s”作为模式,标志在其后。将表达式直接写到这样的变量上可以提供更好的性能,但是不太适合接收变量来构建模式。毕竟,它是硬编码的。 - 正则表达式构造函数
var query = new RegExp('pattern','flags'); 允许我们传入值的构造函数(例如,我们可以用变量替换“模式”和“标志”参数)。这比较慢,但是非常适合通过用户输入动态生成我们的模式。
现在,我们有了RegExp对象。由于它是主对象“类”的扩展,因此具有所有默认属性,但也有一些独特的属性:
- RegExp.source
串。我们正在搜索的模式。这是我们摆弄使用它的上下文之后会遇到的疯狂胡言乱语。 - RegExp.lastIndex
诠释开始下一个搜索的数字,因此,如果您要从湖北福彩串中的第二个湖北福彩开始搜索,则将其设置为1(用于从0开始的编号)。最初,此参数默认为0。找到第一个结果后,它将设置为我们在主湖北福彩串中的结果之后的第一个湖北福彩的索引。因此,如果您搜索一个3个字母的单词,并且该模式与以第2个湖北福彩开头的单词匹配,lastIndex 然后将其设置为7。我们将尽快清除此概念。
RegExp的其他独特属性包含我们传递或写入的标志所设置的值:
- RegExp.ignoreCase
布尔值(i),正如它本身所说的那样,忽略要搜索或查看的湖北福彩串。 - RegExp.global
布尔值(g)。否则,湖北福彩串将仅返回一个结果-第一个结果一遍又一遍。的 g 标志意味着在整个湖北福彩串中搜索(使用您的模式),然后我们可以获得所有结果。 - RegExp.multiline
布尔值(m)。这会将行视为单独的湖北福彩串, ^(湖北福彩串的开头)和 $(湖北福彩串的结尾)将钩在每行的开头和结尾。没有 m 标志,它只会匹配整个湖北福彩串的开始和结束。 - RegExp.sticky
布尔值(y)。只会从中查找匹配项 lastIndex,并且仅此功能,仅在FireFox中受支持,但现在已在ES6规范中支持,因此其他人可以实现它。
让我们进入一个简单的例子。该模式仅查找“ abc”的任何完全匹配项,并设置了三个跨浏览器兼容的标志: i, g和 m。标志的顺序无关紧要。
var myRegExp = / 极客技巧 / igm;
alert("Source: " + myRegExp.source +
"\n Ignore Case : " + myRegExp.ignoreCase +
"\n Global : " + myRegExp.global +
"\n Multiline : " + myRegExp.multiline +
"\n Last Index: " + myRegExp.lastIndex)
/ 极客技巧 / ig 寻找每场比赛 g 完全是极客技巧‘,但请忽略大小写 i 并将新行视为湖北福彩串边界 m
RegExp函数
exec(), 测试(), 比赛(), 搜索(), 更换()和 分裂()
这些人使用RegExp对象并使用它来计算湖北福彩串中的某种结果。他们搜索,检查,创建新湖北福彩串,构建新数组,完成我们可能(我认为)希望他们做的所有事情!对于每个示例,在本节中,我们将使用一个非常简单的模式 / \ a \ w + / 它将匹配以“ a”开头的任何单词。我们还将在湖北福彩串“ aa ab ac”上使用它,这样我们就可以很清楚地看到每个函数的运行情况。您可以将这些示例复制并粘贴到控制台中以进行后续操作,只需确保首先粘贴以下两个值即可:
var stringToSearch = 'aa ab ac';
var myRegExp = / a \ w + / g;
/ a \ w + / g 寻找任何比赛 g,其中“ a”后跟一个或多个 + 文字湖北福彩 \ w
exec()
在搜索可能匹配多个子湖北福彩串的情况下,此函数使我们可以迭代它们。最好在循环中使用它,但是为了清楚起见,我在示例中将对其进行明确说明。此外,这仅适用于全球 g 在我们的RegExp上设置的标志,否则 lastIndex 属性不会增加,我们将停留在第一个结果上。设置好!然后循环。最终,我们将达到最终结果,该exec将一次返回null,然后再次从头开始。
console.log( myRegExp.lastIndex); // 0
console.log( myRegExp.exec(stringToSearch) ); //["aa", index: 0, input: "aa ab ac"]
console.log( myRegExp.lastIndex) // 2
console.log( myRegExp.exec(stringToSearch) ); //["ab", index: 3, input: "aa ab ac"]
console.log( myRegExp.lastIndex) // 5
console.log( myRegExp.exec(stringToSearch) ); //["ac", index: 6, input: "aa ab ac"]
console.log( myRegExp.lastIndex) // 8
console.log( myRegExp.exec(stringToSearch) ); // null
console.log( myRegExp.lastIndex); // 0
console.log( myRegExp.exec(stringToSearch) ); // ["aa", index: 0, input: "aa ab ac"]
console.log( myRegExp.lastIndex) // 2
//and so on
- 指标:
结果的第一个湖北福彩在原始湖北福彩串中的索引(因此,第一个结果在原始湖北福彩串的开头为“ aa”,因此第一个结果为0,第二个结果为3,因为“ ab”的第一个字母是原始湖北福彩串的第三个湖北福彩)串)。 - 输入: 原始湖北福彩串。
测试()
假设您要检查您的模式是否实际上要匹配湖北福彩串中的任何内容。该函数将简单地返回true(是)和false(否)。超级简单!请注意,在RegExp上设置了全局设置后,这还将迭代结果更新 lastIndex 与...完全相同 exec(),因此,如果您已经使用全局模式进行了一些工作并要进行测试,那么对您而言, RegExp.lastIndex = 0; 这样一来,您就不会从原始湖北福彩串的末尾意外测试,从而避免出现误报。
在此示例中,我们可以再次粘贴到控制台中(如果您已经输入了两个变量,则无需再次将它们放进去)。运行几次,看看会发生什么:
console.log( myRegExp.test(stringToSearch) ); //true
console.log( myRegExp.lastIndex); //n
您还可以设置非全局 var myRegExp = / \ a \ w + / ;; 模式,然后再次尝试上述示例,以查看它们的反应。
比赛()
它返回一系列结果,如果您希望计算我们获得多少结果,该方法非常方便!不过请注意该全局标志-没有它,我们只会得到第一个结果。您可能还注意到上面的两个函数(exec和test)是RegExp对象的属性(如我们所说的) RegExp.function('并在此处传递湖北福彩串');)。其余4个功能(匹配,搜索,替换和拆分)是String对象的属性,因此格式会翻转。
stringToSearch.match(myRegExp); // ["aa","ab","ac"]
搜索()
这有点类似于 测试() 因为它允许我们检查模式匹配的湖北福彩串中是否包含任何内容。但是,这将返回第一个匹配项的索引-即使带有全局标志和 lastIndex 超越第一场比赛。同样,给定它返回一个数字,-1表示没有匹配项。
myRegExp.lastIndex = 5; //just to prove search ignores this
stringToSearch.search(myRegExp); // 0
stringToSearch.search(/ad/); // to show -1 as this finds nothing
更换()
找到并替换!我们的Regexp用于匹配湖北福彩串的各个部分,然后将其替换为我们定义的另一个湖北福彩串。 replace函数带有两个参数。 RegExp作为第一个输入,替换湖北福彩串作为第二个输入。
stringToSearch.replace(myRegExp,'替换!');
var newString = stringToSearch.replace(myRegExp,'替换!');
console.log(stringToSearch); // "aa ab ac"
console.log(newString); // "replacement! replacement! replacement!"
注意 : 如果我们不输入替换湖北福彩串“ undefined”,那么,我是唯一发现这种奇怪现象的人吗?如果您要使用replace()删除子湖北福彩串,请输入”作为第二个参数。
分裂()
在某些情况下,当我们有一个湖北福彩串并希望将其拆分为一个子湖北福彩串数组时,每个子湖北福彩串都由我们可以匹配的内容(例如逗号)定义,或者如果湖北福彩串是一团糟,则由更复杂的变量定义。
myRegExp = / /; // just a space
var spaceSeparatedArray = stringToSearch.split(myRegExp);
console.log(spaceSeparatedArray); //["aa", "ab", "ac"]
再次注意,模式不是全局模式,但split()无关紧要。