有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式询问字符串问题

我是一名三年级学生,试图在护士搅动问题上做出自己的区分,我认为这种方法将帮助我满足软约束条件

下面的字符串是给定计划的班次列表

X = No Shift
E = Early
L = Late
D = day
N = Night

我试图检查的约束是<MaxConsecutiveWorkingDays/>

我在Java中工作,试图通过regex找到以下内容

给定以下字符串XXNNEXNDNNLXNNEXLEXDXXXLNE,我想计算XNNEX出现的次数


共 (3) 个答案

  1. # 1 楼答案

    您可以根据要匹配的字符串对其进行拆分,并计算元素的数量,然后减去1(+ "."是为了避免空的结束字符串,它不会包含在数组中)

    String str = "XXNNEXNDNNLXNNEXXLEXDXXXLNE";
    int numMatches = (str + ".").split("XNNEX").length - 1;
    

    它的工作原理如下:

    Initial string:
      XXNNEXNDNNLXNNEXXLEXDXXXLNE
    Array after split:
     {X,    NDNNL,    XLEXDXXXLNE}
    Length = 3
    Number of "XNNEX"s removed = 3 - 1 = 2
    

    编辑:这将无法处理XNNEXNNEX这样的字符串,其中有两个重叠匹配

  2. # 2 楼答案

    根据您的评论(“XNNEXNNEX”=2),输入字符串。斯普利特不适合你。可以使用正则表达式或字符串。indexOf。两者在逻辑上是相似的。我给regex举个例子:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class TestRegex {
    
      static final String test = "you test string";
      static final String PATTERN = "XNNEX";
    
      public final static void main(String[] argv) throws Exception {
        Pattern pattern = Pattern.compile(PATTERN);
        Matcher matcher = pattern.matcher(test);
        int count = 0;
        int index = 0;
        while(matcher.find(index)) {
            ++count;
            // this will reset the matching start point one char back
            // Note: this only works for "XXNEX". Please adjust the "step-back" based on
            // your actual pattern string. 
            index = matcher.end() - 1; 
        }
        System.out.println("count=" + count);
      }
    }
    

    使用String.indexOf()会非常相似:每次比赛后你都需要重置起点。但是String.indexOf()不能进行正则表达式匹配

  3. # 3 楼答案

    更好的方法是使用String#indexOf()方法

    String s="XXNNEXNDNNLXNNEXXLEXDXXXLNE";
    int count=0;
    int fromIndex=-1;
    while ((fromIndex=s.indexOf("XNNEX",fromIndex+1))!=-1) {
        count++;
    }
    System.out.println(count); // 2