我有:\£\d+\.\d\d
应该找到:£6.95£16.95等
+
是一个或多个
\.
是点
\d
用于数字
Greasemonkey的JavaScript
// ==UserScript==
// @name CurConvertor
// @namespace CurConvertor
// @description noam smadja
// @include http://www.zavvi.com/*
// ==/UserScript==
textNodes = document.evaluate(
"//text()",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
var searchRE = /\£[0-9]\+.[0-9][0-9];
var replace = 'pling';
for (var i=0;i<textNodes.snapshotLength;i++) {
var node = textNodes.snapshotItem(i);
node.data = node.data.replace(searchRE, replace);
}
当我将正则表达式更改为/ Free时,例如它找到并更改。但我想我错过了什么!
答案 0 :(得分:3)
如果在删除之前就写了你的最后一个问题。
以下是您使用GM脚本时遇到的问题。
你绝对是在检查每一件事 一些页面上的文本节点 原因。这不是导致它的原因 打破,但这是不必要的和缓慢的。 寻找文本会更好 .price节点和.rrp中的节点 而不是.strike节点。
在中创建新的正则表达式对象时 这样,反斜杠必须是 逃脱,前:
var searchRE = new RegExp('\\ d \\ d','gi');
不
<强>变种 searchRE = new RegExp('\ d \ d','gi');
所以你可以添加反斜杠,或者 像这样创建你的正则表达式:
<强>变种 searchRE = / \ d \ d / gi;
你的实际正则表达式是 只检查数字 ## ANYCHARACTER ##,将忽略£5.00和£128.24
您需要更换 字符串或回调函数,不是 正则表达式对象。
textNodes = document.evaluate(
"//p[contains(@class,'price')]/text() | //p[contains(@class,'rrp')]/span[contains(@class,'strike')]/text()",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
var searchRE = /£(\d+\.\d\d)/gi;
var replace = function(str,p1){return "₪" + ( (p1*5.67).toFixed(2) );}
for (var i=0,l=textNodes.snapshotLength;i<l;i++) {
var node = textNodes.snapshotItem(i);
node.data = node.data.replace(searchRE, replace);
}
的变化:
希望有所帮助!
[edit]其中一些要点不适用,因为原始问题改变了几次,但最终的脚本是相关的,并且为什么你可能仍然对这些点感兴趣你的剧本最初失败了。
答案 1 :(得分:2)
你没错,但有几点需要注意:
\d
。 [0-9]
或[[:digit:]]
是其他可能性。要获得更好的答案,请说明您使用的是哪种语言,最好还发布您的源代码。
答案 2 :(得分:1)
£[0-9]+(,[0-9]{3})*\.[0-9]{2}$
这将匹配从£dd.dd到£d [dd] *,ddd.dd的任何内容。所以它也可以获得数百和数百个。
上述正则表达式在语法方面并不严格。你可以拥有,例如:1123213123.23
现在,如果你想要一个甚至严格的正则表达式,并且你100%确定价格将相应地遵循逗号和句点语法,那么使用
£[0-9]{1,3}(,[0-9]{3})*\.[0-9]{2}$
在这里试试你的正则表达式,看看什么对你有效,什么不对http://tools.netshiftmedia.com/regexlibrary/
答案 3 :(得分:0)
这取决于你正在使用的正则表达式的含义 - 什么是编程语言?
某些旧版本的正则表达式需要转义+
- 例如sed和vi。
此外,某些旧版本的正则表达式无法将\ d识别为匹配数字。
大多数现代正则表达式遵循perl语法,而£\d+\.\d\d
应该可以做到这一点,但它也取决于£
的编码方式 - 如果你匹配的字符串编码与正则表达式编码不同它不会匹配。
以下是Python中的一个示例 - £字符在常规字符串和unicode字符串(以u为前缀)中表示不同:
>>> "£"
'\xc2\xa3'
>>> u"£"
u'\xa3'
>>> import re
>>> print re.match("£", u"£")
None
>>> print re.match(u"£", "£")
None
>>> print re.match(u"£", u"£")
<_sre.SRE_Match object at 0x7ef34de8>
>>> print re.match("£", "£")
<_sre.SRE_Match object at 0x7ef34e90>
>>>
答案 4 :(得分:0)
£不是ascii字符,所以你需要编写编码。根据语言的不同,您需要在正则表达式中转义£的字节,或者在应用正则表达式之前将所有字符串转换为Unicode。
答案 5 :(得分:0)
在Ruby中你可以写下面的
/£\d+.\d{2}/
使用大括号指定点后的位数使其更清晰