找到与java / regex的最后一场比赛

时间:2014-01-20 23:12:16

标签: java regex

我有一个包含“font-family”的动态文本,例如:

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

我想删除所有font-family元素。

我正在使用此代码

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

但它以对我无用的方式移除:

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

我想要的是:

    style=" font-size: 11pt;"

我也尝试过使用这种模式

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

但它不起作用。

你能帮助我吗?

由于

修改

更多案例:

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;"

2 个答案:

答案 0 :(得分: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 ; )
)         

另一种但不那么安全的方式(IMO):跳过&;之间的所有字母:

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

答案 1 :(得分:1)

试试这个:

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