2014-01-20 2 views
0

У меня есть динамический текст, который содержит «семейство шрифтов», например:найти последний матч с Java/регулярным выражением

style="font-family: "Calibri","sans-serif"; font-size:11pt"; 

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

Я использую этот код

patron = Pattern.compile("font-family:(.*?);"); 
    encaja = patron.matcher(cadena); 
    nueva = encaja.replaceAll(""); 

Но удалить таким образом, что это не полезно для меня:

style="Calibri","sans-serif"; font-size: 11pt;" 

Что я хочу:

style=" font-size: 11pt;" 

I также попытался использовать этот образец

font-family:[^(&.*;)]*?; 

Но это не работает.

Вы можете мне помочь?

Благодаря

EDIT

Больше примеров случай:

in: style="font-size:15px; font-family:Arial; mso-ascii-theme-font: minor-latin; " 
output: style="font-size:15px; mso-ascii-theme-font: minor-latin;" 

in: style="font-family:Arial,Aás;; font-size:11pt; mso-fareast-mso-fareast-theme-font: minor-latin;" 
output:style="font-size:11pt; mso-fareast-mso-fareast-theme-font: minor-latin;" 
+0

Пожалуйста, дайте больше примеров края случае ввода и желанной вывод. Я уверен, что есть однострочное решение, но я не уверен, что вы хотите – Bohemian

ответ

2

Вы можете использовать это: описание

String result = yourstr.replaceAll("(?i)font-family:(?>[^;&\"]++|&(?>quot|ntilde);)*(?>;\\s*+|(?=\"))", ""); 

картины:

(?i)   # make the pattern case-insensitive 
font-family: 
(?>   # open an atomic group 
    [^;&\"]++ # all characters except ; & and " one or more times (possessive) 
    |   # OR 
    &   # literal & 
    (?>  # put the different possibilities here 
     quot 
     | 
     ntilde 
    ) 
    ;   # literal ; 
)*    # repeat the atomic group zero or more times 
(?> 
    ;\\s*+  # literal ; and trailing spaces 
    | 
    (?=\")  # followed by " (last value of the attribute without trailing ;) 
)   

Другой, но менее безопасный способ (ИМО): пропустить все буквы, которые между & и ;:

String result = yourstr.replaceAll("(?i)font-family:(?>[^;&\"]++|&[a-z]++;)*(?>;\\s*+|(?=\"))", ""); 
+0

Я забыл сказать, что у меня может быть другой код html внутри, например & ntilde; – OscarSan

+0

@OscarSan: Вам нужно только добавить его в чередование. см. мое редактирование. –

+0

Спасибо за объяснение. И спасибо за то, что так быстро;) – OscarSan

1

Попробуйте это:

newstr = str.replaceFirst("font-family:\s?([^\s]+)", ""); 
+0

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

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