RegEx по цене в £ - PullRequest
       21

RegEx по цене в £

0 голосов
/ 12 апреля 2010

у меня есть: \£\d+\.\d\d

должно найти: £ 6,95 £ 16,95 и т. Д.
+ - это один или несколько
\. это точка
\d для цифры

я не прав? :(


JavaScript для Greasemonkey

// ==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 ]

3 голосов
/ 12 апреля 2010

Написал ли он ваш последний вопрос как раз перед тем, как он был удален.

Вот проблемы, которые возникают у вас с вашим сценарием 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. Ваша замена должна быть либо строка или функция обратного вызова, а не объект регулярного выражения.


Собираем все вместе

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
  • Переменная поиска теперь включает символ целевой валюты
  • Replace variable теперь является функцией, которая заменяет символ валюты новым символом и умножает первую совпавшую подстроку на подстроку * 5.67
  • для цикла устанавливает переменную равной длине снимка в начале цикла вместо проверки textNodes.snapshotLength в начале каждого цикла.

Надеюсь, это поможет!

[править] Некоторые из этих пунктов неприменимы, так как исходный вопрос несколько раз менялся, но окончательный сценарий актуален, и эти пункты могут по-прежнему представлять интерес для вас почему ваш Первоначально ошибка сценария.

2 голосов
/ 12 апреля 2010

Вы не ошибаетесь, но есть несколько вещей, на которые стоит обратить внимание:

  • Знак £ не является стандартным символом ASCII, поэтому у вас может быть проблема с кодировкой, или вам может потребоваться включить опцию Unicode в вашем регулярном выражении.
  • Использование \d поддерживается не во всех механизмах регулярных выражений. [0-9] или [[:digit:]] - другие возможности.

Чтобы получить лучший ответ, скажите, какой язык вы используете, и желательно также опубликуйте свой исходный код.

1 голос
/ 12 апреля 2010
£[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/

0 голосов
/ 12 апреля 2010

В Ruby вы можете написать следующее

/£\d+.\d{2}/

Использование фигурных скобок для указания количества цифр после того, как точка немного прояснит

0 голосов
/ 12 апреля 2010

£ не является символом ascii, поэтому вам нужно выработать кодировки. В зависимости от языка вам нужно будет либо экранировать байт (ы) £ в регулярном выражении, либо преобразовать все строки в Unicode перед применением регулярного выражения.

0 голосов
/ 12 апреля 2010

Это зависит от того, какой тип регулярного выражения вы используете - какой язык программирования?

некоторые старые версии регулярных выражений требуют экранирования +, например, sed и vi.

Также некоторые старые версии регулярных выражений не распознают \ d как совпадающую с цифрой.

Большинство современных регулярных выражений следуют синтаксису perl, и £\d+\.\d\d должно сработать, но это также зависит от того, как кодируется £ - если соответствующая строка кодирует ее иначе, чем регулярное выражение, то она не будет соответствовать .

Вот пример в Python - символ £ по-разному представлен в обычной строке и строке в юникоде (с префиксом 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>
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...