【问题标题】:Unable to know how to use the substitution [duplicate]无法知道如何使用替换[重复]
【发布时间】:2016-11-23 09:17:45
【问题描述】:

我有一个像下面这样的字符串

<a name="1.F"></a>

我正在尝试仅提取值 name 值。我用来完成这项工作的正则表达式是。

搜索字符串

&lt;a name=\"(\d)+(\.)(\w)+\"?&gt;

替换字符串

$1$2$3

结果:这里我得到的结果是介于**之间的结果

搜索结果:

**<a name="1.F">**</a>

当前替换结果:

1.F</a>

预期替换结果:

1.F

请告诉我,我们怎样才能得到预期的结果。

谢谢

【问题讨论】:

  • 使用[^"] 代替\w?此外,您可能需要组内的量词。
  • 您的(\w)+ 匹配到最后。使用[^"]
  • 字符串总是这种格式吗?你真的需要用\d+\.\w+ 预先验证它吗?请注意,在双引号之间提取字符串所需的只是几个字符串方法。与" 拆分并获得第二项也是一种选择。

标签: java regex


【解决方案1】:

鉴于您的示例,您为什么不寻求一个简单的解决方案?比如:你的值用双引号括起来 - 所以只需使用这些知识并捕获这两个“引号”之间的所有内容。

import java.util.regex.*;

public class RegexTest {

  public static void main(String args[]) {
    String s = "<a name=\"1.F\"></a>";
    Pattern p = Pattern.compile("<a name=\\\"(.*)\\\"");
    Matcher m = p.matcher(s);
    if (m.find()) {
      System.out.println(m.group(1));
    }
  }
}   

打印:

1.F

您看,您甚至不需要正则表达式,您可以使用String.indexOf() 来快速获取该引号的位置。

另一方面,如果您的示例只是被简化了,而您的实际输入非常复杂(例如:真正的 HTML 或 XML)......那么首先忘记使用正则表达式(参见here for为什么会这样)。

【讨论】:

  • 嗨@GhostCat,这似乎不起作用,因为.* 将被捕获直到&lt;/a&gt;,而且我在验证后发布了这个。 :)
  • @GhostCat,您的正则表达式将捕获" 之间的所有内容,因此它是正确的。结果在第一个捕获组中。
【解决方案2】:

更新

@user3872094 我刚刚用你的模式&lt;a name=\"(\d)+(\.)(\w)+\"?&gt; 测试了我的代码,它给出了输出1.F。所以我怀疑这个错误来自你的 Java 代码

    String s = "**<a name=\"1.F\">**</a>";
    Pattern p = Pattern.compile("<a name=\"(\\d)+(\\.)(\\w)+\"?>");
    Matcher m = p.matcher(s);
    while (m.find()) {
        System.out.println(m.group(1) + m.group(2) + m.group(3));
    }

=>> 1.F

【讨论】:

  • 嗨@AntonyDao,你能解释一下幕后发生的事情吗?谢谢
  • 您好@user3872094 在测试您的模式后,我认为您的模式是正确的。请查看我的更新答案。
猜你喜欢
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2016-03-21
  • 2018-07-10
  • 2019-05-20
相关资源
最近更新 更多