- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章JS中的正则表达式及pattern的注意事项由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
RegExp对象的创建:
常规的正则表达式的创建可用直接量,即斜杠 “/” 括起来的字符。但在要求参数变化的环境下,RegExp()构造函数是更好的选择:
1
2
|
var
reg1 = /
'\w+'
/g;
var
reg2 =
new
RegExp(
'\'\\w+\''
,
'g'
);
|
对比两种创建方式,RegExp中的第一个参数为要创建的正则字符串,一方面注意,因为不是直接量的表示形式,因此不用斜杠“ / ”括起来了;而是字符串中必须要对引号“ ‘ ”和转义符号“ \ ”进行二次转义.
此外,无论是直接量还是RegExp()构造函数,都是生成了新的RegExp对象,并将其赋值给变量.
在《Javascript权威指南》一书中讲到,对于正则表达式的直接量,ECMAscript 3规定在每次它时都会返回同一个RegExp对象,因此用直接量创建的正则表达式的会共享一个实例。直到ECMAScript 5才规定每次返回不同的实例.
各浏览器中,IE一直遵守ECMAScript 5中的规定,其他浏览器的较老版本则遵循ECMAScript 3的规定。因此在实际应用中,采取构造函数创建的方法比较安全,或者在使用lastIndex属性时要记得归0.
括号()的使用:
1、分组 。
即把单独项组合成子表达式统一处理,一般用于?、+、*、{n,m}等的重复处理。见例子:
var reg = /Java(script)?/,
式子里将script进行统一处理.
2、向后引用 。
即在正则表达式中用“\n”(n代表引用的序号)引用式中前面括号中匹配的文本。见例子:
1
2
3
4
|
var
reg = /(\d+)[a-z]{3}\1/;
//20man20
//20man23 错
//reg = /\1[a-z]{3}(\d+)/; 错
|
注意 “\n”引用的是前面匹配的文本" 20 ",而不是匹配的正则表达式" \d+ "。另外,JS里只能引用前面的匹配文本,像例子中的将 \1写在括号引用的前面,将不会匹配到任何文本,浏览器中会提示出错。同样,JS里也不支持类似“ (?<name>exp) ”(exp为正则字符)的引用命名规则,只支持数字的引用.
既然提到了分组和引用,如果只想进行分组,而不想引用,则可用 "(?: exp)"的形式,既不匹配文本,也不给引用编号。见例子:
1
2
|
var
reg = /(\w{3})(?:\d+)([a-z]{2})\2/;
//man7788abab
|
显然 \2 匹配的是 "ab" 而不是 "7788" 。这样便于分组处理,也加快了查询的效率.
3、子模式匹配 。
有时我们想直接引用操作括号匹配的本文,那么可以用子模式匹配的功能(权威指南里叫子模式匹配,有点别扭,实际就是用一个变量形式替换匹配的文本)。基本形式是用 '$n'的形式替代匹配编号为n的文本,常用在String对象里的replace()方法,见例子,等号两边交换单词:
1
2
3
4
|
var
reg = /(\w+)=(\w+)/;
var
str = ‘love=hate
';
str.replace(reg,'
$2=$1');
//"hate=love"
|
次序、贪婪、懒惰:
一般的重复匹配字符如?、+、*、{n,m}在匹配的过程中,采用贪婪匹配的方法,即尽可能多的匹配到结果字符。与之对应的是懒惰匹配,即尽可能少的匹配结果,使用形式只需在重复匹配字符后加上问号" ? "即可,如??、+?、*?、{n,m}?。见例子:
1
2
3
|
var
str = 'goooogle‘;
var
reg1 = /o+/;
//"goooo"
var
reg2 = /o+?/;
//"go"
|
现在对例子稍加改动:
1
2
3
|
var
str = 'goooogle‘;
var
reg1 = /o+gle/;
//"oooogle"
var
reg2 = /o+?gle/;
//"oooogle"
|
改过后的例子结果变为相同了,为什么 /o+?gle/ 没有匹配到“ogle”呢?原来正则表达式中总是从左往右进行匹配的,不会从右边获取子串进行匹配.
虽然上面的结果相同,但匹配的原理不太一样。在reg1中,首先o+会匹配所有的"o",然后接着匹配"gle",从而完成整体匹配。而在reg2中,o+?会先匹配一个"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失败。进而回溯至o+?去匹配第二个"o",成功后再在第3位到第4位匹配"gle",以此类推……最后匹配到整个字符串.
总体要记住,从优先级来说,从左往右的次序匹配 > 贪婪 / 懒惰匹配.
零宽断言:
关于零宽断言的总体解释可参考博文《正则表达式30分钟入门教程》,值得注意的是,JS里只支持零宽先行断言。即零宽正预测先行断言"(?=exp)"和零宽负预测先行断言“(?!exp)"。 所谓“零宽”,就是它并不在匹配的结果字符中占据空间。例如“\w","\s"就会占据一个或几个空间,依匹配的字符长度决定。而像”^","$"这种对应的首末位置,不占据空间,零宽就是属于这一类.
所谓“正 / 负预测”,是指断言中要求满足的情况。“正”表示要满足exp,“负”表示要不满足exp的.
所谓"先行",是指被匹配的字符串在前面,零宽断言跟在后面。即串的后一部分是否满足断言.
所谓“断言”,就是判断的条件.
看两种零宽断言的例子:
1
2
3
|
var
str =
'java coffeescript'
;
var
reg1 = /\b\w+(?=script\b)/;
//coffee
var
reg2 = /\b\w+(?!script\b)/;
//java
|
reg1为零宽正预测先行断言,"(?=script\b)"表示某单词需以“script”结尾,它代表着一种条件,不占有任何空间大小.
同样,reg2为零宽负预测先行断言,"(?!script\b)"表示不以“script”结尾的单词.
另外,因为没有零宽后顾断言,不能判断某字符串的前面部分满足什么条件。但在JS中可以用多次正则表达式来实现:先匹配到要找的串,然后截取开头到index的字符子串,再匹配子串末尾是否符合需要的断言条件。具体用法可另外尝试一下.
match()与exec()的异同:
match和exec是正则表达式匹配字符串的常用方法。两者实现的功能差不多,有些细微的区别:
1、使用方式 。
match是字符串包装对象的方法,用法:String.match(RegExp); exec是正则表达式对象的方法,用法:RegExp.exec(String),
2、返回的结果 。
当RegExp没有设置全局标志 "g" 时:
两者的返回结果相同。即无匹配值时返回null,有匹配值时返回一个数组(令array)。array[0]为匹配的字符串,array[1]、array[2]……则对应为正则表达式中圆括号匹配的子字符串$1、$2……。同时数组带有两个属性,array.index表示匹配字符串的初始位置,array.input表示正在检索的字符串.
当RegExp有设置全局标志 "g" 时:
match在有值时返回一个数组array。数组的每项依次表示匹配到的所有的字符串,因此不再有圆括号匹配的子字符串了。此时数组没有index属性和input属性.
exec则与没有全局标示 "g" 的表现无异。此时返回的是数组array,array[0]为当前匹配的字符串,array[1],array[2]……则为当前匹配下的圆括号匹配的字串。此时要注意RegExp对象的lastIndex属性,表示原字符串中匹配的字符串末尾的后一个位置。当没有进一步的匹配结果时,lastIndex属性置0。因此,可用lastIndex的循环找出所有的匹配字符串。来看看例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
var
str =
'I love1 my job22'
;
var
reg = /\b[a-z]+(\d+)\b/g;
array = str.match(reg);
//array = ["love1", "job22"]
//array.index = undefind
//array.input = undefined
------------------------------------
array = reg.exec(str);
//array = ["love1", "1"]
//array.index = 2
//array.input = "I love1 my job22"
//reg.lastIndex = 7
//run again
reg.exec(str);
//array = ["job22", "22"]
//array.index = 11
//array.input = "I love1 my job22"
//reg.lastIndex = 16
//run again
reg.exec(str);
//reg.lastIndex = 0
|
最后,考虑到ECMAScript 3 和ECMAScript 5的版本区别,每次匹配完之后记得要手动将RegExp对象的lastIndex属性置0,以满足老非IE浏览器的要求.
js正则表达式,pattern,注意事项 。
一句话,请使用,/\w+@+\w+(\.+\w+){1,}/.test(str) 来验证,不要用"\w+@+\w+(\.+\w+){1,}".test(str) 来验证; 使用后者,直接,用add@dfddf 就可以通过验证了; 。
最后此篇关于JS中的正则表达式及pattern的注意事项的文章就讲到这里了,如果你想了解更多关于JS中的正则表达式及pattern的注意事项的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个加号/减号按钮,希望用户不能选择超过 20 个但不知道如何让它工作。我尝试使用 min="1"max="5 属性,但它们不起作用。这是我的代码和一个 fiddle 链接。https://jsf
我正在尝试复制顶部底部图,如示例 here但它没有正确渲染(紫色系列有 +ve 和 -ve 值,绿色为负值)留下杂乱的人工制品。我也在努力创建一个玩具示例来复制这个问题,所以我希望尽管我缺乏数据,但有
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 6 年前。 社区去年审查了是
这个问题在这里已经有了答案: Adding two positive integers gives negative answer.Why? (4 个答案) 关闭 5 年前。 我遇到了一个奇怪的问题
有谁知道如何将字符串值类型 -4,5 或 5,4 转换为 double -4.5 或 5.4? 最佳答案 只需使用 Double.parseDouble(Locale, String); 糟糕,我很困
我正在尝试根据 TextBlob 分类插入一个仅包含“正”或“负”字符串的新数据框列:对于我的 df 的第一行,结果是 ( pos , 0.75, 0.2499999999999997)我想要' 正
我对 VBA 非常陌生,无法理解如何在一个循环中完成 2 个任务。我非常感谢您的帮助。 我已经能够根据第 3 列中的数据更改第 2 列中的数值,但我不明白如何将负值的字体更改为红色。 表格的大小每月都
欢迎, 我正在使用 jquery 通过 POST 发送表单。 这就是我获得值(value)的方式。 var mytext = $("#textareaid").val(); var dataStrin
double d = 0; // random decimal value with it's integral part within the range of Int32 and always p
我有这个字符串: var a='abc123#xyz123'; 我想构建 2 个正则表达式替换函数: 1) 用 '*' 替换所有确实有 future '#'的字符(不包括'#') 所以结果应该是这样的
我正在使用 DialogFragment。当用户从 Gmail 平板电脑应用程序的屏幕与下面示例图片中的编辑文本进行交互时,我希望正面和负面按钮保持在键盘上方。 在我的尝试中不起作用,这是我的 Dia
从组装艺术一书中,我复制了这句话: In the two’s complement system, the H.O. bit of a number is a sign bit. If the H.O
是否有更好更优雅的方法来实现下面的简单代码(diffYear、A 和 B 是数字): diffYear = yearA - yearB; if (diffYear == 0) { A = B
我正在设计一种语言,并尝试确定 true 应该是 0x01 还是 0xFF。显然,所有非零值都将转换为 true,但我正在尝试确定确切的内部表示。 每种选择的优点和缺点是什么? 最佳答案 没关系,只要
在我的 dialogfragment 类的 OnCreateDialog 中,我正在这样做: AlertDialog.Builder builder = new AlertDialog.Builder
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda usin
我偶然发现了一个奇怪的 NSDecimalNumber 行为:对于某些值,调用 integerValue、longValue、longLongValue 等,返回意想不到的值(value)。示例: l
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda using
我有这个正则表达式来测试用户输入是否有效: value.length === 0 || value === '-' || (!isNaN(parseFloat(value)) && /^-?\d+\.
我想用高斯混合模型拟合数据集,数据集包含大约 120k 个样本,每个样本有大约 130 个维度。当我使用 matlab 执行此操作时,我运行脚本(簇号为 1000): gm = fitgmdist(d
我是一名优秀的程序员,十分优秀!