我是一名三年级学生,试图在护士训练问题上做出区分,我认为这种方法可以帮助我满足软约束
下面的字符串是给定时间表的班次列表
X = No Shift
E = Early
L = Late
D = day
N = Night
我尝试检查的约束是<MaxConsecutiveWorkingDays/>
我正在使用Java并尝试使用正则表达式查找以下内容。
鉴于以下字符串XXNNEXNDNNLXNNEXXLEXDXXXLNE,我想查找XNNEX发生次数的计数
答案 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);