【问题标题】:String Pattern Matching In JavaJava中的字符串模式匹配
【发布时间】:2011-12-17 18:59:36
【问题描述】:

我想在输入字符串中搜索给定的字符串模式。

例如。

String URL = "https://localhost:8080/sbs/01.00/sip/dreamworks/v/01.00/cui/print/$fwVer/{$fwVer}/$lang/en/$model/{$model}/$region/us/$imageBg/{$imageBg}/$imageH/{$imageH}/$imageSz/{$imageSz}/$imageW/{$imageW}/movie/Kung_Fu_Panda_two/categories/3D_Pix/item/{item}/_back/2?$uniqueID={$uniqueID}"

现在我需要搜索字符串 URL 是否包含“/{item}/”。请帮帮我。

这是一个例子。实际上我需要检查 URL 是否包含匹配“/{a-zA-Z0-9}/”的字符串

【问题讨论】:

    标签: java string matching


    【解决方案1】:

    如果您想检查某个字符串是否存在于另一个字符串中,请使用 String.contains 之类的内容

    如果您想检查字符串中是否存在某些 pattern,请使用 '.*' 附加和前置模式。结果将接受包含该模式的字符串。

    示例:假设您有一些正则表达式 a(b|c) 来检查字符串是否匹配 abac
    .*(a(b|c)).* 将检查字符串是否包含 @ 987654325@或ac

    这种方法的一个缺点是它不会给你匹配的位置,如果你需要匹配的位置,你可以使用 java.util.Mather.find()。

    【讨论】:

      【解决方案2】:

      这只是String.contains的问题:

      if (input.contains("{item}"))
      

      如果你需要知道它发生在哪里,你可以使用indexOf

      int index = input.indexOf("{item}");
      if (index != -1) // -1 means "not found"
      {
          ...
      }
      

      匹配 exact 字符串很好 - 如果您需要真正的 模式(例如“三个数字后跟最多 2 个字母 AC”),那么您应该查看 @987654322 @。

      编辑:好的,听起来你确实想要正则表达式。你可能想要这样的东西:

      private static final Pattern URL_PATTERN =
          Pattern.compile("/\\{[a-zA-Z0-9]+\\}/");
      
      ...
      
      if (URL_PATTERN.matches(input).find())
      

      【讨论】:

      • 感谢您的即时回复。现在我编辑了这个问题。你能帮帮我吗?
      • @1355:好的,这完全改变了问题的性质......但你的意思并不是很清楚。请给出一些您想要匹配和不想匹配的 URL 示例。是“任意数量的字母/数字,但必须放在大括号中”吗?
      • 我需要检查这个模式“/{a-zA-Z0-9}/”。该模式应包括两个斜杠和两个大括号。但字母可以是任何东西。
      • 例如:“/{asdFs7f}/”、“/{asdfg}/”、“/{ASDF}/”、“/{23445}/”。现在我想你明白我的意思了。在该 URL 字符串中有许多子字符串,例如“/{$asdf}/”。它不应该匹配。
      【解决方案3】:

      您可以为此使用Pattern 类。如果您只想匹配 {} 中的单词字符,那么您可以使用以下正则表达式。 \w[a-zA-Z0-9_] 的简写。如果您对_ 没问题,请使用\w,否则使用[a-zA-Z0-9]

      String URL = "https://localhost:8080/sbs/01.00/sip/dreamworks/v/01.00/cui/print/$fwVer/{$fwVer}/$lang/en/$model/{$model}/$region/us/$imageBg/{$imageBg}/$imageH/{$imageH}/$imageSz/{$imageSz}/$imageW/{$imageW}/movie/Kung_Fu_Panda_two/categories/3D_Pix/item/{item}/_back/2?$uniqueID={$uniqueID}";
      Pattern pattern = Pattern.compile("/\\{\\w+\\}/");
      Matcher matcher = pattern.matcher(URL);
      if (matcher.find()) {
          System.out.println(matcher.group(0)); //prints /{item}/
      } else {
          System.out.println("Match not found");
      }
      

      【讨论】:

      • 使用 \\w+ 时 + 是什么意思?
      • @COLDICE + 是一个量词,意思是一次或多次。
      【解决方案4】:

      您可以使用string.indexOf("{item}") 来完成。如果结果大于-1 {item}在字符串中

      【讨论】:

      • :感谢您的即时回复。现在我编辑了这个问题。你能帮帮我吗?
      • Jon 已经这样做了,所以没有必要重复他。您需要Pattern 和可选的Matcher.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多