2015-03-29 2 views
1

Я не очень хорошо использую регулярное выражение и трачу на два дня, чтобы исправить эту проблему и, конечно, искать решения в stackoverflow, но ничего не решить мою проблему. и вот в чем проблема.javascript regex для соответствия строке с номером и без него

переменная оценка будет увеличена на 1 с использованием этого кода

@inc score 

мы фиксируем переменную, используя это регулярное выражение

inc: /^@inc (.*)$/ 

и это аргумент

if (match.inc) { 
    section = this.addAttribute(match.inc[1] + '+=1', story, section, passage, isFirst, inputFilename, lineCount); 
} 

тогда я стараюсь продвинул его немного больше, чтобы это было

@inc score 15 

и я изменить регулярное выражение

inc: /^@inc (.*)()(.\d*)$/ 

и что код отлично работает с этим изменением

if (match.inc) { 
    section = this.addAttribute(match.inc[1] + '+=' + match.inc[3], story, section, passage, isFirst, inputFilename, lineCount); 
} 

мой вопрос, как регулярное выражение должно быть? если я хочу сохранить как рабочие

@inc score   <----- will increase by 1 

@inc score 100000 <----- will increase by number 

и, конечно, как аргумент должен быть?

вот фактический код link строки 197 и строки 299

извините за мой плохой английский, а не мой родной язык

ответ

1

Я не совсем уверен, что синтаксис вы используете (но тогда я не очень привык к JavaScript ...), но вот небольшой отрывок, который должен быть в состоянии дать вам некоторые идеи:

var scores = ["@inc score", "@inc score 100"]; 

var re = /@inc score(?: (\d+))?/; 

for (i = 0; i < scores.length; i++) { 
    var inc = scores[i]; 

    if (result = inc.match(re)) { 
     var addition = "+=" + (result[1] === undefined ? '1' : result[1]); 
     alert(addition); 
    } 
} 

jsfiddle demo

когда вход "@inc score", результат становится +=1 и когда это "@inc score 1000", становится +=1000.

(?: (\d+))? в регулярном выражении соответствует необязательной группе, содержащей 1 пробел и не менее 1 цифры. Цифры захватываются и будут вторым элементом результирующего списка при попытке совпадения. Этот элемент является тем, что тестируется на условном/тройном операторе.


EDIT: К сожалению, использовать score в качестве переменной быть увеличена, вы можете использовать ту же концепцию, построена несколько иначе:

var scores = ["@inc score", "@inc score 1000", "@inc amount 1000"]; 

var re = /@inc (\S+)(?: (\d+))?/; 

for (i = 0; i < scores.length; i++) { 
    var inc = scores[i]; 

    if (result = inc.match(re)) { 
     var addition = result[1] + "+=" + (result[2] === undefined ? '1' : result[2]); 
     alert(addition); 
    } 
} 

Я думаю, в вашем собственном коде, он должен быть как :

inc: /^@inc (\S+)(?: (\d+))?$/ 

и

if (match.inc) { 
    section = this.addAttribute(match.inc[1] + '+=' + (match.inc[2] === undefined ? '1' : match.inc[2]), story, section, passage, isFirst, inputFilename, lineCount); 
} 
+0

переменная оценки просто пример, потому что пользователь может использовать любой строка, которую они хотят, например, цель @inc, деньги и т. д. вот фактический код [link] (https://github.com/textadventures/squiffy/blob/master/compiler.js) строка 197 и строка 299 – caberg

+0

@caberg Хорошо, я изменил регулярное выражение для строки '@ inc'. И, извините, я не разработчик javascript, но я попытался вставить эту логику в ваш код (отредактированный ответ). – Jerry

+0

УДИВИТЕЛЬНЫЙ чувак, ваши коды действительно работают Большое вам спасибо – caberg

1

Я хотел бы использовать это регулярное выражение ^@inc (.*?)(?:(\s)(\d+))?$

Вы можете увидеть его в действии здесь https://regex101.com/r/dO6yN8/2 ,

В первой группе захвата он захватывает все, пока не увидит пробел (если он существует), по какой-то причине вы хотели быть во второй группе захвата, а затем фиксируете числа после этого пространства в третьей группе. Однако пространство и числа необязательны.

+0

Я думаю, что поддержка нескольких пространств - хорошая опция '^ @ inc (. *?) (?: (\ S +) (\ d +))? $' – mshaaban

+0

Я думаю, что это регулярное выражение хорошо, но опять же, как насчет аргумента ?. вот фактический код [link] (https://github.com/textadventures/squiffy/blob/master/compiler.js) строка 197 и строка 299 извините за мой noobness – caberg

Смежные вопросы