正则表达式询问String NurseRoisteringProblem

时间:2014-07-21 22:16:51

标签: java regex

我是一名三年级学生,试图在护士训练问题上做出区分,我认为这种方法可以帮助我满足软约束

下面的字符串是给定时间表的班次列表

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

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

我正在使用Java并尝试使用正则表达式查找以下内容。

鉴于以下字符串XXNNEXNDNNLXNNEXXLEXDXXXLNE,我想查找XNNEX发生次数的计数

4 个答案:

答案 0 :(得分:3)

根据您的评论(&#34; XNNEXNNEX&#34; = 2),String.split不适合您。您可以使用正则表达式或String.indexOf。两者在逻辑上都是相似的。我给出了正则表达式的一个例子:

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()无法进行正则表达式匹配。

答案 1 :(得分:1)

使用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

答案 2 :(得分: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个重叠匹配。

答案 3 :(得分:0)

这也可行:

String str1 = "XXNNEXNDNNLXNNEXXLEXDXXXLNE";
String str2 = "XXNEX";
int count = (str1.Length-((str1.Replace(str2,"").Length))/str2.Length;
System.out.println(count);