2014-01-27 2 views
0

Я пытаюсь передать сообщение с помощью Node-Red (nodered.org) в функцию.Извлечь шестнадцатеричный код из строки с помощью regex

Так что сообщение будет что-то вроде: Can I have 00ff00 please?

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

var str = msg.payload; 
var colorCode = str.match([A-Fa-f0-9]{6}/g); 
return colorCode; 

Что-то не так, и я получаю сообщение об ошибке говорящее Unexpected token {

Это не работает, даже если я ставлю [A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]/g я получаю A is not defined ошибку, вероятно, потому, что Безразлично» t рассматриваем его как регулярное выражение.

+6

У вас не хватает a "/" перед вашим регулярным выражением - это 'str.match (/ some regex/g);' – mplungjan

+0

также вы можете немного укоротить его с помощью модификатора i –

ответ

1

Вам нужно положить /

Используйте любой из

str.match(/[A-Fa-f0-9]{6}/) или

str.match(/[a-f0-9]{6}/i)

вместо str.match([A-Fa-f0-9]{6})

Теперь, если ваша строка может содержать несколько кодов HEX используйте следующие вместо этого:

str.match(/[a-f0-9]{6}/gi) -> Это будет получать массив всех таких HEX кодов и, следовательно, вы можете получить доступ к каждому такому экземпляру с помощью индекса массива следующим образом:

str="Can I have 00fA00 and B0fA0c please?" 
hex_codes=str.match(/[a-f0-9]{6}/gi); 
//hex_codes[0]=="00fA00" and hex_codes[1]=="B0fA0c" 

Вот fiddle demo

+0

Несколько лучше – mplungjan

+0

Я все еще получаю undefined все, что я передаю в качестве ввода var str = "Могу ли я получить 00ff00, пожалуйста?" var colorCode = str.match (/ [A-Fa-f0-9] {6} /); return colorCode; Выход: undefined Это то же самое, даже если я поставлю параметр/g и получаю результат с возвратом colorCode [0]; – Ariestar

+0

Действительно ли это сейчас? –

-1

Как указано в комментариях, вы пропустили / перед своим Regex, чтобы удовлетворить синтаксис Regex Javascript.

Кроме того, я хотел бы предложить вам установить границы вашего регулярного выражения, чтобы избежать некоторых странных сценариев (например, ловли «BABABABABA»). Кроме того, как указано в комментариях ниже, #FFF является допустимым значением для цвета, поэтому ваше Regex может быть дополнительно улучшено. В результате получается следующее:

/\b([a-f0-9]{3}|[a-f0-9]{6})\b/i 

Задвижки:

Can I have C0ffee please? 
The color is #FFF 

Не поймать:

Testing 00000ff0000 just to be safe! 
Making sure BABABABABA doesn't get catched also :) 
Checking #ffff 

В качестве последней ноты, вы можете рассмотреть вопрос об использовании шаблон #RRGGBB, чтобы поймать эти цвета HEX, просто потому, что вы можете найти действительные английские слова с 6 символами с буквами от A-F. Итак, если вы хотите сделать это, просто добавьте \# перед вашим регулярным выражением:

/\#\b([a-f0-9]{3}|[a-f0-9]{6})\b/i 

Check this Regex101, он содержит некоторые примеры некоторых входов.

+1

-1, '# 444' является цветом HEX. – Pinal

+0

Достаточно справедливо, {3,6}, затем – everton

+1

@EvertonAgner ... это все равно позволит # 4444 –

1

Цвет HEX всегда начинается с # и может содержать 3 или 6 Значения цифр.Попробуйте /^#[a-z0-9]{3}([a-z0-9]{3})?$/i:

'#fff000'.match(/^#[a-z0-9]{3}([a-z0-9]{3})?$/i);//["#fff000", "000"] 
'#fff'.match(/^#[a-z0-9]{3}([a-z0-9]{3})?$/i);//["#fff", undefined] 

Также у вас есть опечатка (Вы забыли regexp начала слэш), фиксированное регулярное выражение:

/[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]/g 

Сокращенный вариант для 6-ти цифр, только значение:

'#fff000'.match(/^#[a-z0-9]{6}$/i);//["#fff000"] 

Или многоцветная проверка строки:

'#fff000 #aaabbb #ccc999'.match(/#[a-z0-9]{6}/gi); 
+0

Для этого предположим, что все используемые шестнадцатеричные коды - 6 цифр. Итак, теперь у меня есть этот код: 'var colorCode = msg.payload.match (/ [A-Fa-f0-9] {6}/g); return colorCode; ' Это не вызывает никаких ошибок, но независимо от того, что я помещаю в качестве ввода, если регулярное выражение верное, я получаю «undefined» . Я также попытался использовать/i вместо/g, тот же эффект Спасибо за ваш help – Ariestar

+0

Я редактирую свой ответ. Я добавил 6-значное значение только для регулярного выражения. – Pinal

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