【问题标题】:java regEx, really confusedjava regEx,真的很困惑
【发布时间】:2013-05-31 09:45:48
【问题描述】:

请帮助开发一个正则表达式。我的要求是验证以下字符串,

String="asdasd|adajjsd|asas,asdas|asda|sd";

模式 id [String]separatedByPipe[String]separatedByPipe[String]

例如:String="asdasd|adajjsd|asas".

上面的模式重复,用逗号分隔,如果有多个Strings 例如:String="asdasd|adajjsd|asas,asdas|asda|sd";

我可以假设该模式最多只能重复 3 次,即我的字符串中最多有 2 个逗号。

附上我的 testClass

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestReg {

public static void main(String[] args) {

    //String regex = "[a-z]+\\|[a-z]+,[a-z]+\\|[a-z]*";
    String regex = "([a-z]\\|[a-z]\\|[a-z]\\,?)+";
    //String regex = "[a-z]+\\|re{ 1}[a-z]+\\|re{ 1}[a-z]+[a-z]+\\|[a-z]+\\|[a-z]*";
    //String regex = "[a-z](|)[a-z](,)[a-z](|)[a-z]";
    //String pattern="([a-z]+@)([a-z]+)(\\.[a-z]+)"; 
    //String inputString1 = "shdifhsdui-asdasd,shdifhsdui|abc";


    //String inputString1 = "";//failed
    String inputString1 = "asdasd|adajjsd|asas,asdas|asda|sd";//success
    //String inputString1 = "asdasd|adasd-asdas|asdasd";//success
    //String inputString1 = "asdasd|adasd|asassa,asdas|asdasd";//failed
    Pattern pattern1 = Pattern.compile(regex);
    Matcher matcher1 = pattern1.matcher(inputString1);
    boolean result = matcher1.find();          
    System.out.println(result);
}

}

大家好,

System.out.println ("asdasd|adajjsd|asa,s|sad|sdas,asd|as|as|da".matches ("([a-z]*\\|[a-z]*\\|[a-z]*\\,?)+"));

像魅力一样工作。那么为什么在我上面的课程中同样不起作用。请帮助。我正在使用 jdk1.5

【问题讨论】:

  • , 不需要反斜杠转义,因为它在正则表达式中没有特殊含义。

标签: java regex


【解决方案1】:

这个 java 正则表达式将符合您的要求:

"[a-z]+(\\|[a-z]+){2}(,[a-z]+(\\|[a-z]+){2})*"

这将验证输入,但要提取部分,我只需在逗号上使用split(),然后在管道上拆分每个部分:

for (String group : input.split(",")) {
    String[] parts = group.split("\\|");
    // do something with the parts
}

只需两行代码即可获取您的数据。

【讨论】:

  • 嗨,下面的字符串失败了。字符串 inputString1 = "asdasd|adajjsd|asas,asdas|asda|sd|";我最后添加了一个额外的管道。我不适合使用拆分方法。
  • 如果使用“.matches()”方法,你的答案是正确的。我已经编辑了这个问题。请看一看。 matcher() 和 matches(),给出不同的输出。
  • 我可以分开工作,但是以您的示例为例,您是否希望最后有一个空白字段?
【解决方案2】:

将字符串正则表达式更改为

String regex = "([a-z]*\\|[a-z]*\\|[a-z]*\\,?)+";

然后试试

    String inputString1 = "asdasd|adajjsd|asas,asdas|asda|sd";
    String regex = "([a-z]*\\|[a-z]*\\|[a-z]*\\,?)+";
    Pattern pattern1 = Pattern.compile(regex);
    Matcher matcher1 = pattern1.matcher(inputString1);
    boolean result = matcher1.find();          

    System.out.println(inputString1.substring(matcher1.regionStart(), matcher1.regionEnd()));

【讨论】:

  • 嗨,下面的字符串失败了。字符串 inputString1 = "asdasd|adajjsd|asas,asdas|asda|sd|";我最后添加了一个额外的管道。
  • 我已经编辑了这个问题。请看一看。 matcher() 和 matches(),给出不同的输出。
【解决方案3】:

, 上拆分,然后在| 上拆分

String[] terms = string.split(",");
for (String term : terms) {
    String[] parts = term.split("\\|");
}

【讨论】:

  • 我已经编辑了这个问题。请看一看。 matcher() 和 matches(),给出不同的输出。
【解决方案4】:

您可以使用此正则表达式对其进行验证

^(?!.*,$)[a-z]+(\\|[a-z]+,?)*$

【讨论】:

  • @SujeeshSValath 你应该在你的问题中指定所有有效和无效的组合..否则没有人能帮助你
  • 我已经编辑了这个问题。请看一看。 matcher() 和 matches(),给出不同的输出。
【解决方案5】:

如果您想将整个静态字符串作为一个字符串进行测试,那么此正则表达式模式将帮助您.. 但如果您想测试由“|”分隔的不同字符串那么你需要采取其他正则表达式模式。

字符串正则表达式 = "([az]{6}\|[az]{7}\|[az]{4}\,[az]{5}\|[az]{2}?)+" ;

【讨论】:

  • 嗨,下面的字符串失败了。字符串 inputString1 = "asdasd|adajjsd|asas,asdas|asda|sd|";我最后添加了一个额外的管道。
【解决方案6】:

如果有帮助,请尝试:

String regex = "[a-z]*\\|*,*[a-z]*";

其余代码不需要更改。

【讨论】:

  • 字符串 inputString1 失败 = "asdasd|adajjsd|asas,asdas|asda|sd|"
  • 请试试这个字符串正则表达式 = "[a-z]*\\|*,[a-z]*\\|";。还请从您的需求角度指定可能的组合。我同意 Anirudh 的观点。
  • 我已经编辑了这个问题。请看一看。 matcher() 和 matches(),给出不同的输出。
  • 您在代码中尝试匹配的模式是:一个字符|一个字符|一个字符,一个字符|一个字符|一个字符 当您在 [az] 之后放置 * 时,它匹配 0 次或多次出现的字符,因此当您使用 String 类的匹配项时它可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2021-02-26
相关资源
最近更新 更多