Java 正则表达式询问字符串问题
我是一名三年级的学生,试图在护士Roistering问题上做出区分,我认为这种方法将有助于我满足软约束条件 下面的字符串是给定计划的班次列表Java 正则表达式询问字符串问题,java,regex,Java,Regex,我是一名三年级的学生,试图在护士Roistering问题上做出区分,我认为这种方法将有助于我满足软约束条件 下面的字符串是给定计划的班次列表 X = No Shift E = Early L = Late D = day N = Night 我试图检查的约束是 我在Java中工作,并试图通过正则表达式找到以下内容 给定以下字符串xxnnexndnnlxnnexxlexxxxlne,我想找出XNNEX出现的次数 .更好的方法是使用String#indexOf()方法 String s="XXNN
X = No Shift
E = Early
L = Late
D = day
N = Night
我试图检查的约束是
我在Java中工作,并试图通过正则表达式找到以下内容
给定以下字符串xxnnexndnnlxnnexxlexxxxlne,我想找出XNNEX出现的次数
.更好的方法是使用
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
更好的方法是使用
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
您可以根据要匹配的字符串将其拆分,并计算元素数,然后减去1(
+“
是为了避免数组中不包含的空结束字符串)
它的工作原理如下:
Initial string:
XXNNEXNDNNLXNNEXXLEXDXXXLNE
Array after split:
{X, NDNNL, XLEXDXXXLNE}
Length = 3
Number of "XNNEX"s removed = 3 - 1 = 2
编辑:这将无法处理XNNEXNNEX之类的字符串,其中有2个重叠的匹配项。您可以根据要匹配的字符串对其进行拆分,并计算元素数,然后减去1(
+“
是为了避免空的结束字符串,因为它不会包含在数组中)
它的工作原理如下:
Initial string:
XXNNEXNDNNLXNNEXXLEXDXXXLNE
Array after split:
{X, NDNNL, XLEXDXXXLNE}
Length = 3
Number of "XNNEX"s removed = 3 - 1 = 2
编辑:这将无法在XNNEXNNEX等字符串上工作,其中有2个重叠匹配。这也可以工作:
String str1 = "XXNNEXNDNNLXNNEXXLEXDXXXLNE";
String str2 = "XXNEX";
int count = (str1.Length-((str1.Replace(str2,"").Length))/str2.Length;
System.out.println(count);
这也可以起作用:
String str1 = "XXNNEXNDNNLXNNEXXLEXDXXXLNE";
String str2 = "XXNEX";
int count = (str1.Length-((str1.Replace(str2,"").Length))/str2.Length;
System.out.println(count);
根据您的评论(“XNNEXNNEX”=2),String.split不适用于您。您可以使用regex或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()
无法进行正则表达式匹配 根据您的评论(“XNNEXNNEX”=2),String.split对您不起作用。您可以使用regex或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()
无法进行正则表达式匹配 那你为什么需要正则表达式呢indexOf
version的+1Pattern
/Matcher
版本将无法获得正确的输入结果,因为它不允许在单独的匹配中重复使用相同的字符(您需要回头看看才能解决它),但如果我知道您,我可能会从我的答案中删除这一部分(这里只有indexOf
似乎足够/更可取)@Pshemo是的,我们必须尽可能避免使用正则表达式。感谢。+1用于indexOf
版本Pattern
/Matcher
版本将无法获得正确的输入结果,因为它不允许在单独的匹配中重复使用相同的字符(您需要回头看看才能解决它),但如果我知道您,我可能会从我的答案中删除这一部分(这里只有indexOf
似乎足够/更可取)@Pshemo是的,我们必须尽可能避免使用正则表达式。谢谢。将在两种情况下失败(1)如果XNNEX
位于字符串末尾(因为结果数组中有空字符串的尾随)(2)如果字符可以是少数匹配项的一部分(bob
在bobob
中存在两次),这一点很好。我没有看到关于XNNEXNNEX的评论被算作2。(通过追加字符固定字符串结尾)实际上追加字符也会把事情搞砸,因为您不能确定这不会创建另一个可能的匹配。更好的选择是使用带负值的split
。我添加的字符(一个句点)不能作为匹配的一部分。在本例中,是的,我谈论的更多的是一般解决方案。在两种情况下会失败(1)如果XNNEX
位于字符串末尾(因为结果数组中有空字符串尾随)(2)如果字符可以是少数匹配项的一部分(bob
在bobob
中存在两次),这是一个很好的观点。我没有看到关于XNNEXNNEX的评论被算作2。(通过追加字符固定字符串结尾)实际上追加字符也会把事情搞砸,因为您不能确定这不会创建另一个可能的匹配。更好的选择是使用带有负值的split
。我添加的字符(句点)不能作为匹配的一部分。在本例中,是的,我更多地讨论了一般解决方案。