Assertions - JavaScript 编辑
断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始或终止部分(如向前断言,向后断言以及条件表达式)。
类型
边界类断言
字符 | 含义 |
---|---|
^ | 匹配输入的开头。如果多行模式设为 true,
|
$ | 匹配输入的结束。如果多行模式设为 true, |
\b | 匹配一个单词的边界,这是一个字的字符前后没有另一个字的字符位置, 例如在字母和空格之间。需要注意的是匹配的单词边界不包括在匹配中。换句话说,匹配字边界的长度为零。 一些例子:
匹配退格字符 ( |
\B | 匹配非单词边界。这是上一个字符和下一个字符属于同一类型的位置:要么两者都必须是单词,要么两者都必须是非单词,例如在两个字母之间或两个空格之间。字符串的开头和结尾被视为非单词。与匹配的词边界相同,匹配的非词边界也不包含在匹配中。例如, |
其他断言
提示:?
字符也可用作量词
字符 | 含义 | |
---|---|---|
|
| |
x(?!y) |
| |
(?<=y)x |
| |
(?<!y)x |
|
示例
一般边界类型概述示例
// 使用 正则表达式边界修复错误字符串 buggyMultiline = `tey, ihe light-greon apple tangs on ihe greon traa`; // 1) 使用 ^ 修正字符串开始处和换行后的匹配. buggyMultiline = buggyMultiline.replace(/^t/gim,'h'); console.log(1, buggyMultiline); // 修复 'tey'=>'hey'(字符串开始) , 'tangs'=>'hangs'(换行后) // 2) 使用 $ 修正字符串结尾处的匹配. buggyMultiline = buggyMultiline.replace(/aa$/gim,'ee.'); console.log(2, buggyMultiline); // 修复 'traa' => 'tree'. // 3) 使用 \b 修正单词和空格边界上的字符. buggyMultiline = buggyMultiline.replace(/\bi/gim,'t'); console.log(3, buggyMultiline); // 修复 'ihe' => 'the' 不影响 'light'. // 4) 使用 \B 匹配实体边界内的字符. fixedMultiline = buggyMultiline.replace(/\Bo/gim,'e'); console.log(4, fixedMultiline); // 修复 'greon' 不影响'on'.
使用 ^(控制字符)匹配输入的开头
使用 ^
匹配输入的开头。在这个例子中,我们可以通过 /^A/ 正则表达式得到以A开头的水果。为了选择合适的水果,我们可以使用带有箭头函数的过滤方法.
let fruits = ["Apple", "Watermelon", "Orange", "Avocado", "Strawberry"]; // 使用正则 /^A/ 选择以'A'开头的水果. // 这里的 '^' 只有一种含义: 匹配输入的开头. let fruitsStartsWithA = fruits.filter(fruit => /^A/.test(fruit)); console.log(fruitsStartsWithA); // [ 'Apple', 'Avocado' ]
在第二个示例中,^用于在输入的开始处匹配,以及在内部使用时用于创建否定或被补充的字符集 组和范围.
let fruits = ["Apple", "Watermelon", "Orange", "Avocado", "Strawberry"]; // 使用正则 /^[^A]/ 选择 不是以 ‘A’ 开头的水果 // 在这个例子中,“^” 控件符号表示两种含义: // 1) 匹配输入的开头 // 2) 一个否定的字符集: [^A] ,意思是匹配不是 ‘A’ 的字符 let fruitsStartsWithNotA = fruits.filter(fruit => /^[^A]/.test(fruit)); console.log(fruitsStartsWithNotA); // [ 'Watermelon', 'Orange', 'Strawberry' ]
匹配字边界
let fruitsWithDescription = ["Red apple", "Orange orange", "Green Avocado"]; // 选择包含以 “en” 或 “ed” 结尾的单词的描述: let enEdSelection = fruitsWithDescription.filter(descr => /(en|ed)\b/.test(descr)); console.log(enEdSelection); // [ 'Red apple', 'Green Avocado' ]
向前断言
// JS 向前断言 x(?=y) 匹配被 y 跟随的 x let regex = /First(?= test)/g; console.log('First test'.match(regex)); // [ 'First' ] console.log('test First peach'.match(regex)); // null console.log('This is a First test in a year.'.match(regex)); // [ 'First' ] console.log('This is a First peach in a month.'.match(regex)); // null
向前否定断言
例如, /\d+(?!\.)/
匹配没有被小数点跟随且至少有一位的数字。 /\d+(?!\.)/.exec('3.141')
匹配 "141" 而不是 "3"
console.log(/\d+(?!\.)/g.exec('3.141')); // [ '141', index: 2, input: '3.141' ]
不同含义的'?!':断言和范围的组合用法
不同含义的?!
结合使用 断言 /x(?!y)/
和 范围 [^?!]
.
let orangeNotLemon = "Do you want to have an orange? Yes, I do not want to have a lemon!"; let selectNotLemonRegex = /[^?!]+have(?! a lemon)[^?!]+[?!]/gi console.log(orangeNotLemon.match(selectNotLemonRegex)); // [ 'Do you want to have an orange?' ] let selectNotOrangeRegex = /[^?!]+have(?! an orange)[^?!]+[?!]/gi console.log(orangeNotLemon.match(selectNotOrangeRegex)); // [ ' Yes, I do not want to have a lemon!' ]
向后断言
let oranges = ['ripe orange A ', 'green orange B', 'ripe orange C',]; let ripe_oranges = oranges.filter( fruit => fruit.match(/(?<=ripe )orange/)); console.log(ripe_oranges); // [ 'ripe orange A ', 'ripe orange C' ]
规范
详述 |
---|
ECMAScript (ECMA-262) RegExp: Assertions |
浏览器 兼容性
有关浏览器兼容性的信息,请查看 main Regular Expressions compatibility table.
另请参阅
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论