RegEx的价格为£

时间:2010-04-11 21:54:19

标签: regex

我有:\£\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时,例如它找到并更改。但我想我错过了什么!

6 个答案:

答案 0 :(得分:3)

如果在删除之前就写了你的最后一个问题。

以下是您使用GM脚本时遇到的问题。

  1. 你绝对是在检查每一件事 一些页面上的文本节点 原因。这不是导致它的原因 打破,但这是不必要的和缓慢的。 寻找文本会更好 .price节点和.rrp中的节点 而不是.strike节点。

  2. 在中创建新的正则表达式对象时 这样,反斜杠必须是 逃脱,前:

    var searchRE = new RegExp('\\ d \\ d','gi');

    <强>变种 searchRE = new RegExp('\ d \ d','gi');

    所以你可以添加反斜杠,或者 像这样创建你的正则表达式:

    <强>变种 searchRE = / \ d \ d / gi;

  3. 你的实际正则表达式是 只检查数字 ## ANYCHARACTER ##,将忽略£5.00和£128.24

  4. 您需要更换 字符串或回调函数,不是 正则表达式对象。


  5. 全部放在一起

    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);
    }
    

    的变化:

    • Xpath现在仅包含p.price和p.rrp span.strke节点
    • 搜索使用/ regex /创建的正则表达式而不是新的RegExp
    • 搜索变量现在包含目标货币符号
    • 替换变量现在是一个用新符号替换货币符号的函数,并将第一个匹配的子字符串与子字符串相乘* 5.67
    • for循环将变量设置为循环开头的快照长度,而不是在每个循环开始时检查textNodes.snapshotLength。

    希望有所帮助!

    [edit]其中一些要点不适用,因为原始问题改变了几次,但最终的脚本是相关的,并且为什么你可能仍然对这些点感兴趣你的剧本最初失败了。

答案 1 :(得分:2)

你没错,但有几点需要注意:

  • £符号不是标准的ASCII字符,因此您可能遇到编码问题,或者您可能需要在正则表达式上启用unicode选项。
  • 并非所有正则表达式引擎都支持使用\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}/

使用大括号指定点后的位数使其更清晰