在使用 Tkinter 时,出现无限循环问题通常与事件绑定、函数调用以及窗口更新循环的方式有关。...Tkinter 是一个事件驱动的 GUI 库,它依赖主循环 (mainloop()) 来处理用户交互和事件。如果代码的某一部分引发了循环或递归调用,可能会导致无限循环或应用程序无响应。...但是,如果没有选择文件,file 变量将为 None,并且 shutil.copy2() 函数将在没有源文件的情况下尝试复制文件,这会导致无限循环。...谨慎使用 update(),频繁的 update() 调用可能导致无限循环,应使用 after() 进行调度。...通过合理设计事件处理逻辑,可以避免无限循环,并确保 Tkinter 应用程序始终保持响应状态。如果你有具体的代码或错误信息,我可以帮助进一步调试。
调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。 exec 返回一个数组,其中存放匹配的结果。...因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。...最新标准已废弃 支持正则表达式的 String 对象的方法 search stringObject.search(regexp) 返回值:stringObject 中第一个与 regexp 相匹配的子串的起始位置...split stringObject.split(separator,howmany) 匹配到匹配项,函数未return,会返回undefined,即符合函数的返回值 lastIndex指向问题 使用带有...标志考虑到,从而导致匹配失败) regex.lastIndex; // 0 (匹配失败后重置) multiline multiline 是一个布尔对象,如果使用了 “m” 标志,则返回 true;否则
在使用match方法时,如果不指定g属性,则与RegExp对象的exec方法可以等价,而不是只有一个元素的数组。...并可得到每个小匹配的index和lastIndex; b)如果以上例子没有g的情况,则以上例子,exec方法没有更新RegExp 对象的全局属性(index、lastIndex等),以上例子会陷入死循环...开始我以为如果两个RegExp对象在交叉执行exec时,可能index等会清零。因为我认为index属性是保存在RegExp的全局静态属性上的。...是等价的; 4)exec永远返回与第一个匹配相关的信息,其返回数组第一个值是第一个匹配的字串,剩下的是所有分组的反向引用(即子括号的匹配内容); 5)exec在设置g属性后,虽然匹配结果不受g的影响,返回结果仍然是一个数组...(第一个值是第一个匹配到的字符串,以后的为分组匹配内容),但是会改变index和lastIndex等的值,将该对象的匹配的开始位置设置到紧接这匹配子串的字符位置,当第二次调用exec时,将从lastIndex
var pattern6 = new RegExp("\\.at","gi"); 通过RegExp函数定义的正则表达式与字面量定义的有点不同。...此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本...当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。...); //此处RegExp.lastIndex和arr.lastIndex均有同样的属性,可以互换。...,因为re的lastindex在执行之后,属性被重置为0,所以循环一直在0,3处循环。
下面是我对正则的理解: 正则就是用有限的符号,表达无限的序列,殆已!...,都优先匹配上限而不是下限 a{1, 3} // 匹配字符串'aaa'的话,会匹配aaa而不是a 有时候这不是我们想要的结果,可以在量词后面加上?... // 匹配 123 或 456 或 789 分组与引用 分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx) (abc){2} // 匹配...b", index: 0, input: "abc"] RegExp.$_ // abc 上一次匹配的字符串 RegExp.$1 // b 上一次匹配的捕获分组 RegExp.input // abc... 上一次匹配的字符串 RegExp.lastMatch // ab 上一次匹配成功的字符 RegExp.length // 2 上一次匹配的数组长度 实例属性 正则表达式的实例上也有一些属性 flags
="highlight">$&'); 在 innerHTML 匹配关键字,将关键字替换成高亮的 span,然后重新替换 innerHTML 这样实现虽然非常简单,但会导致 shadowRoot...对于每个文本节点,我们使用 exec 方法来查找匹配指定文本的子串,并将每个匹配的子串用黄色高亮显示。...在 TreeWalker 遍历过程中修改节点,会导致遍历到新节点,从而可能会出现意外的结果。为了避免这种情况,我们可以将需要修改的节点保存到一个数组中,在遍历完成后再对这些节点进行修改。...在遍历过程中调用 deleteContents 和 insertNode 方法,会导致遍历到新节点,从而可能会出现意外的结果。...highlightText,已高亮的节点,仍然会创建 span,这就会导致 span 重复嵌套。
当在循环中用到正则对象lastIndex判断终止条件时,一定不要使用直接量正则表达式写法,否则每次循环lastIndex都会被重置为0,这是因为每次执行字面量正则表达式时,都会转换为一个新的RegExp...对象,相应的lastIndex当然也会变成0。...如果正则表达式设置了全局标志g,执行test()会改变RegExp.lastIndex属性,用于记录上次匹配到的字符的起始索引。...lastIndex会随着exec()和test()的执行而更新 var reg = /\d/g reg.lastIndex // 0 reg.test('123456') reg.lastIndex /...与exec()的不同点在于,如果match方法传入的正则表达式带了标识g,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。
", "/") ); // => "2017/06.27" 2.2 match返回结果的格式问题 match返回结果的格式,与正则对象是否有修饰符 g有关。...上面提到了正则实例的 lastIndex属性,表示尝试匹配时,从字符串的 lastIndex位开始去匹配。...字符串的四个方法,每次匹配时,都是从0开始的,即 lastIndex属性始终不变。 而正则实例的两个方法 exec、 test,当正则是全局匹配时,每一次匹配完成后,都会修改 lastIndex。...下面让我们以 test为例,看看你是否会迷糊: var regex = /a/g; console.log( regex.test("a"), regex.lastIndex ); console.log...regex) return ; var result, results = []; // 没有修饰符g的话,会死循环
="highlight">$&');在 innerHTML 匹配关键字,将关键字替换成高亮的 span,然后重新替换 innerHTML这样实现虽然非常简单,但会导致 shadowRoot...对于每个文本节点,我们使用 exec 方法来查找匹配指定文本的子串,并将每个匹配的子串用黄色高亮显示。...在 TreeWalker 遍历过程中修改节点,会导致遍历到新节点,从而可能会出现意外的结果。为了避免这种情况,我们可以将需要修改的节点保存到一个数组中,在遍历完成后再对这些节点进行修改。...在遍历过程中调用 deleteContents 和 insertNode 方法,会导致遍历到新节点,从而可能会出现意外的结果。...highlightText,已高亮的节点,仍然会创建 span,这就会导致 span 重复嵌套。
>> y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。...>>> 其实y修饰符就是要求下一次匹配的lastIndex位置必须是对应匹配到的元素(粘连)。而g修饰符是lastIndex后拥有匹配到即可。...const regexp = /a/g // 指定从2号位置(y)开始匹配 regexp.lastIndex = 2 // 匹配成功 const match = regexp.exec('xaya')...) // 3 console.log(regexp.lastIndex) // 4 // 进一步说, y修饰符号隐含了头部匹配的标志 ^ 。...,但是字型很相近,比如,\u004B与\u212A都是大写的K。
如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。...ES6 将这 4 个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上。...y修饰符同样遵守lastIndex属性,但是要求必须在lastIndex指定的位置发现匹配。...# RegExp.prototype.sticky 属性 与y修饰符相匹配,ES6 的正则实例对象多了sticky属性,表示是否设置了y修饰符。...“后行断言”的实现,需要先匹配/(?的x,然后再回到左边,匹配y的部分。这种“先右后左”的执行顺序,与所有其他正则操作相反,导致了一些不符合预期的行为。
字符串方面 String方法中有四种方法支持正则表达式 1、search() 该方法是最简单的方法了,它以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的话,返回-1。...multiline同理,代表m是否多行匹配。 lastIndex是一个可读写的整数,存储下一次开始匹配的位置。...PS:无论正则表达式是否具有g标示,exec返回的数组类型都是一样的,但是它会把lastIndex属性设置到紧接匹配子串的字符位置,以便下次继续匹配,因为这点特殊性,exec可以遍历调用。...PS:这个要小心一个坑,如果你用这2个方法匹配多个字符串,而每次匹配一个字符串又没有匹配完时,lastIndex属性不会自己重置为0的。下面是例子。...当在循环中有重复正则匹配的时候,用编译后的正则表达式执行起来,效率更高(前提是正则表达式是固定的,如果你每次循环都需要动态适配新正则的话,是没有效果的)。
,或检索与正则表达式相匹配的子字符串,并返回第一个与之匹配的子字符串的位置 console.log('JAVA is not javascript'.search(/java/i));//0 注意:search...()方法不支持全局检索,因为他会忽略正则表达式参数中的修饰符g replace(): 用于检索与替换操作,接收两个参数,第一个是正则表达式,第二个是要进行替换的字符串,该方法可以全局匹配 console.log...is not javascrip match(): 用于检索字符串中与正则表达式匹配的结果,参数必须是正则表达式,返回一个由匹配结果组成的数组 在match方法中如果正则表达式设置修饰符g,则返回的数组是字符串中所有匹配的结果...对象的属性 RegExp 对象包含5个属性 属性 描述 global 只读的布尔值,用于说明表达式是否带有修饰符g ignoreCase 只读的布尔值,用于说明表达式是否带有修饰符i lastIndex...,在全局匹配模式下,exec方法会设置lastIndex 属性的值,exec()的下次检索会从lastIndex属性指示的字符处开始检索 var pattern = /java/ig; var text
若检索成功,返回「第一个」与RegExp对象匹配的字符串的起始位置,否则返回-1。 let str = "hello leo!"...若检索成功,返回与reg匹配的所有结果的一个「数组」,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果,否则返回null。...2.2.3 replace 将字符串中「指定字符」替换成「其他字符」,或替换成一个与正则表达式匹配的字符串。...,导致第二行输出true,加入u修饰符后ES6就会识别为一个字符,所以输出false。...一个y修饰符对match方法只能返回第一个匹配,与g修饰符搭配能返回所有匹配。
RegExp 前言 正则表达式是很重要的。几乎每一门语言都会去支持正则表达式,ECMAScript是通过RegExp类型来支持正则的。...匹配模式标记 g :全局模式,表示查找字符的全部内容 i :不区分大小写,表示查找匹配时忽略pattern和字符串的大小写 m :多行模式,表示查找到一行文本末尾会继续查找 y :粘附模式,表示只查找从...lastIndex开始及之后的字符串。...5.2.2 RegExp实例方法 这里我们介绍两个方法 exec() 和 test() exec() 参数:要应用模式的字符串 需求:内部的匹配项"and baby",内部的 "and dad" 或...构造函数属性 通过以下属性可以提取出与exec()和test()执行的操作相关信息 input 缩写 $_ 最后搜索的字符串 lastMatch 缩写 $& 最后匹配的文本 lastParen
/).)*'; } return block; }); return new RegExp(`^${regBlock.join('/')}$`, 'ig'); } 问题 然后在进行调试的时候发现一个奇怪的现象...连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex属性值)....通过文档说明得知,当我们正则表达式带有g标识进行全局匹配时,匹配成功后,regex实例中会有一个lastIndex属性去记录本次命中正则的最后一位的下标+1,用于在下一次调用test的时候,从lastIndex...从而导致问题。 并且通过验证得出,当匹配成功后,lastIndex会记录下一次开始的位置,但是当匹配失败,lastIndex会归零从头开始。...至此这一次被坑经历耗时60分钟左右,耽误了吃饭最佳时间,导致饭堂菜都快没有。但是同时也收获到JavaScript在正则上一个容易被忽略的坑。好像也不亏。
第二部分:RegExp对象的属性和方法 2.1属性 2.1.1:修饰符,返回布尔值 ignoreCase:忽略大小写;i;属性只读 global:全局匹配;g;属性只读 multiline:多行匹配;m...index:模式匹配成功的第一个位置(0开始计数); input:参数字符串 如果正则表达式中包含圆括号(即"组匹配"),返回的数组会包含多个成员;第一个成员是整个匹配成功的结果,第二个成员是圆括号里面匹配成功的结果...split():按照给定规则对字符串进行分割;返回一个数组,包含分割后各个成员 3.1:String.prototype.match():字符串的match()方法与正则对象的exec()方法十分相似...:匹配成功返回数组;匹配失败返回null; 区别:当正则表达式带有g修饰符,match()会返回所有结果;而exec()返回一个结果。...3.2 String.prototype.search():返回第一次匹配成功在整个字符串的位置;否则返回-1 同样的,设置lastIndex属性对search()无效;并且search()会忽略g修饰符
它将 RegExp 对象的 lastIndex 属性设置为一个数字,该数字指示搜索停止的位置。...对象有一个名为 lastIndex 的属性。...如果模式匹配失败,则将 lastIndex 设置为0。 注意:你可以检查 RegExp 对象是否启用了标志。...const regexp = /([0-9]{2})-([0-9]{2})-([0-9]{4})/y; regexp.lastIndex = 14; console.log(regexp.sticky)...Unicode 标志 ES6 也带来了对 Unicode 的更好支持。添加 Unicode 标志 u 可以启用与 Unicode 相关的其他功能。
示例:'abcabc'.indexOf('b',0); //1 'abcabc'.indexOf('b',2); //4 search(regexp) 检索与正则表达式相匹配的值...示例:'abcabc'.search('b'); //1 'abcabc'.search(/b/img); //1 match(regexp) 找到一个或多个正则表达式的匹配...二、RegExp 直接量语法:/pattern/attributes 创建RegExp对象的语法:new RegExp(pattern, attributes); RegExpObject.lastIndex...用于规定下次匹配的起始位置。...attributes: i 执行对大小写不敏感的匹配。 g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 m 执行多行匹配。
常见问题与易错点: 类型不匹配:创建数组时,元素类型必须与声明类型一致,否则会导致编译错误。...数组越界:尝试访问数组索引超出范围的元素会抛出ArrayIndexOutOfBoundsException。...常见问题与易错点: 忘记更新索引:在手动遍历数组时,忘记递增索引可能导致无限循环。 使用错误的索引:使用负数或大于数组长度的索引会导致数组越界。...示例与避免策略: For循环 // 使用for循环遍历数组 for (int i = 0; i < numbers.length; i++) { System.out.println(numbers...for循环遍历数组 for (int num : numbers) { System.out.println(num); } 避免错误的通用策略: 正确声明数组类型:确保数组元素类型与声明的类型一致
领取专属 10元无门槛券
手把手带您无忧上云