2014-01-08 2 views
2

В настоящее время я пытаюсь проверить шаблон регулярного выражения соответствия следующим образом:Regex для шестнадцатеричных цветовых кодов в bbcode?

[#123456] 

[#aabc36] 

А затем преобразовать в HTML-кодах:

<FONT COLOR="#123456"> 

Но если картина, как:

[/#123456] 

затем следует заменить на

</FONT> 

Я попытался следующую закономерность:

\\[#[A-Fa-f0-9]{6}\\]|\\[[A-Fa-f0-9]{3}\\] 

но терпит неудачу.

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

Ниже мой метод для замены регулярных выражений:

public String replaceColor(String text , String imageLocation){ 

    StringBuffer imageBuffer = new StringBuffer (""); 

    String bbcode = "\\[#[A-Fa-f0-9]{6}\\]|\\[[A-Fa-f0-9]{3}\\]"; 

    Pattern pattern = Pattern.compile(Pattern.quote(bbcode)); 
    Matcher matcher = pattern.matcher(text); 

    //populate the replacements map ... 
    StringBuilder builder = new StringBuilder(); 
    int i = 0; 
    while (matcher.find()) { 

     //String orginal = replacements.get(matcher.group(1)); 
     imageBuffer.append("<FONT COLOR=\"#123456\">"); 
     String replacement = imageBuffer.toString(); 
     builder.append(text.substring(i, matcher.start())); 

     if (replacement == null) { 
      builder.append(matcher.group(0)); 
     } else { 
      builder.append(replacement); 
     } 
     i = matcher.end(); 
    } 

    builder.append(text.substring(i, text.length())); 
    return builder.toString(); 
} 
+0

Remove 'Pattern.quote', который спасаясь все регулярные выражения метасимволы в' bbcode'. –

+0

Как извлечь слова bbcode между [] в любом случае? –

ответ

3

попробовать этот

s = s.replaceAll("\\[#(\\w{6}|\\w{3})]", "<FONT COLOR=\"#$1>\">") 
      .replaceAll("\\[/#(\\w{6}|\\w{3})]", "</FONT>"); 
+0

Выглядит неплохо, но вы не учитываете трехзначные, сжатые значения, такие как '# 123'. –

+0

Я вижу, исправлено, спасибо –

2

Вы должны удалить Pattern.quote вызов, который делает ваш матч регулярок все буквальные символы. Если вы хотите захватить часть матча, вам нужна группа соответствия (). Для того, чтобы упростить ее, изменить выражение следующим образом:

String bbcode = "\\[(#[A-Fa-f0-9]{3}([A-Fa-f0-9]{3})?)\\]"; 

И использовать matcher.group(1) ссылаться на часть в квадратных скобках.

+0

Хорошее регулярное выражение, но вам не нужно использовать 'group (1)' напрямую. Просто выполните 'replaceAll()' как в [другом ответе] (http://stackoverflow.com/a/20985753/20938), используя '$ 1', чтобы снова вставить шестнадцатеричное значение. –

+0

спасибо большое, разрешено –