【问题标题】:Regular expression in Java that takes as input alphanumeric followed by forward slash and then again alphanumericJava中的正则表达式,将字母数字作为输入,后跟正斜杠,然后再输入字母数字
【发布时间】:2011-07-13 19:04:10
【问题描述】:

我需要一个正则表达式,它将字母数字作为输入,然后是正斜杠,然后是字母数字。我如何在 Java 中为此编写正则表达式?

示例如下:

adc9/fer4

我尝试使用正则表达式如下:

String s = abc9/ferg5;
String pattern="^[a-zA-Z0-9_]+/[a-zA-z0-9_]*$";
if(s.matches(pattern))
{
    return true;
}

但问题是它接受所有形式 abc9/ 的字符串而不在正斜杠后检查。

【问题讨论】:

  • 句点 . 不是字母数字。是否需要期限?或者这是您的示例中的疏忽?
  • 字母数字应该多短/多长?它必须是字母然后是数字还是任何排列?
  • 这真的很简单。该文档可以帮助您编写此正则表达式。见download.oracle.com/javase/6/docs/api/java/util/regex/…
  • @JBNizet:问题在于该文档未能解释如何在 Java 中获取字母数字字符。具体方法见下文。
  • @tchrist:来自我链接到的文档:“\p{Alnum} 一个字母数字字符:[\p{Alpha}\p{Digit}]”。我想这完全取决于您对“字母数字”的含义。

标签: java regex alphanumeric character-properties


【解决方案1】:

参考:http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

Pattern p = Pattern.compile("[a-z\\d]+/[a-z\\d]+", CASE_INSENSITIVE);

希望这会有所帮助。

【讨论】:

  • [a-z] 并非所有字母代码点。当然,这只是 a-z。
  • @tchrist - 我测试了那个模式字符串,它是字母数字的
  • 错误:[a-z] 匹配所有 ASCII 字母字符。这与所有字母字符不同。
  • @Mike:那么当今天一切都在使用 Unicode 时,为什么要限制你的正则表达式只在一个 50 年前的标准上工作呢?
【解决方案2】:

我会使用:

String raw = "adc9/fer4";
String part1 = raw.replaceAll("([a-zA-Z0-9]+)/[a-zA-Z0-9]+","$1");
String part2 = raw.replaceAll("[a-zA-Z0-9]+/([a-zA-Z0-9]+)","$1");

[a-zA-Z0-9] 允许任何字母数字字符串 + 是一个或多个 ([a-zA-Z0-9]+) 表示存储组的值 $1 表示召回第一组

【讨论】:

  • 您无法使用 Java 正则表达式轻松编写“字母数字”,但对于许多用途而言,[\pL\pN\pM] 可能是可接受的替代品。
  • 为什么 [a-zA-Z0-9] 不起作用?它是字母数字字符。
  • 我不知道那 1 美元,太棒了
  • @Spidy 您也可以在 $ 之后使用 1-9 进行分组。 0美元就是全部。我忘记了如何做超过 9 个小组,但我很少遇到需要它的时间。
  • @RedFoxSan:肯定不是“字母数字字符”!!在别处查看正确的解决方案。
【解决方案3】:

这是模拟 \w 含义所需的 Java 代码:

public final static String
    identifier_chars = "\\pL"          /* all Letters      */
                     + "\\pM"          /* all Marks        */
                     + "\\p{Nd}"       /* Decimal Number   */
                     + "\\p{Nl}"       /* Letter Number    */
                     + "\\p{Pc}"       /* Connector Punctuation           */
                     + "["             /*    or else chars which are both */
                     +     "\\p{InEnclosedAlphanumerics}"
                     +   "&&"          /*    and also      */
                     +     "\\p{So}"   /* Other Symbol     */
                     + "]";

public final static String
identifier_charclass     = "["  + identifier_chars + "]";       /* \w */

public final static String
not_identifier_charclass = "[^" + identifier_chars + "]";       /* \W */

现在在模式中使用identifier_charclass,只要你需要一个\w 字符,not_identifier_charclass 任何你想要一个\W 字符的地方。它不是很符合标准,但它比 Java 对那些错误的定义要好得多。

【讨论】:

    【解决方案4】:

    星号应该是加号。在正则表达式中,星号表示 0 或更多; plus 表示 1 或更多。您在斜线之前的部分之后使用了加号。您还应该在斜线后面的部分使用加号。

    【讨论】:

    • 你能在这里写准确的表达吗?
    • 好的:“^[a-zA-Z0-9_]+/[a-zA-z0-9_]+$”。就像你以前一样,但星号变成了加号。
    【解决方案5】:

    我认为最短的 Java 正则表达式是 "^\\w+/\\w+$"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多