- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
来自 Javascript: The Definitive Guide :
When
regexp
is a global regular expression, however,exec()
behaves in a slightly more complex way. It begins searchingstring
at the character position specified by thelastIndex
preperty ofregexp
. When it finds a match, it setslastIndex
to the position of the first character after the match.
我认为任何经常使用 javascript RegExps 的人都会认出这段话。但是,我发现此方法有一个奇怪的行为。
考虑以下代码:
>> rx = /^(.*)$/mg
>> tx = 'foo\n\nbar'
>> rx.exec(tx)
[foo,foo]
>> rx.lastIndex
3
>> rx.exec(tx)
[,]
>> rx.lastIndex
4
>> rx.exec(tx)
[,]
>> rx.lastIndex
4
>> rx.exec(tx)
[,]
>> rx.lastIndex
4
RegExp 似乎卡在第二行并且不会增加 lastIndex
属性。这似乎与The Rhino Book矛盾.如果我自己按如下方式设置它,它会继续并最终按预期返回 null,但似乎我不必这样做。
>> rx.lastIndex = 5
5
>> rx.exec(tx)
[bar,bar]
>> rx.lastIndex
8
>> rx.exec(tx)
null
显然,只要匹配项为空字符串,我就可以递增 lastIndex
属性。但是,作为好奇的类型,我想知道为什么 exec
方法不增加它。为什么不是呢?
我在 Chrome 和 Firefox 中观察到了这种行为。它似乎只有在有相邻的换行符时才会发生。
Tomalak下面说把pattern改成/^(.+)$/gm
会导致表达式不会卡住,但是空行会被忽略。可以更改它以仍然匹配该行吗?谢谢解答Tomalak !
使用以下模式并使用第 1 组适用于我能想到的所有字符串。再次感谢Tomalak .
/^(.*)((\r\n|\r|\n)|$)/gm
先前的模式返回空行。但是,如果您不关心空行,Tomalak给出了以下解决方案,我认为它更清晰。
/^(.*)[\r\n]*/gm
前两个解决方案都会卡在尾随换行符处,因此您必须去除它们或手动增加 lastIndex
。
我在 Flagrant Badassery 找到了一篇详细介绍 lastIndex
跨浏览器问题的好文章.除了很棒的博客名称外,这篇文章还让我对这个问题有了更深入的了解,并提供了一个很好的跨浏览器解决方案。解决方法如下:
var rx = /^/gm,
tx = 'A\nB\nC',
m;
while(m = rx.exec(tx)){
if(!m[0].length && rx.lastIndex > m.index){
--rx.lastIndex;
}
foo();
if(!m[0].length){
++rx.lastIndex;
}
}
最佳答案
问题是点在
^(.*)$
不匹配换行符,但是使用 "m"
开关可以使 "^"
和 "$"
锚定到新行行字符。也就是说"\n"
和"\n"
之间的"nothing"可以和"(.*)"
匹配成功。
由于此匹配项的宽度为零,因此 lastIndex
属性无法前进。尝试:
^(.+)$
编辑:要匹配空白行,请执行以下操作:
^(.*)\n? // remove all \r characters beforehand
或
^(.*)(?:\r\n|\n\r|\n|\r)? // all possible CR/LF combinations, but *once* at most
...然后只去匹配组 1。
关于Javascript - 多行正则表达式 : lastIndex stuck on newlines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/381214/
我有一个加号/减号按钮,希望用户不能选择超过 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
我是一名优秀的程序员,十分优秀!