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

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

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

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

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方法也可以接受它应该开始搜索的位置,因此每次找到想要的内容时,都要在该位置之后开始搜索。对于一般字符串,这个问题是不明确的。考虑字符串“XNNEXNEX”。你认为计数是1还是2?考虑字符串“XNNEXNEX”,我会认为这是2,谢谢你,大声喧哗的护士?大声喧哗的护士?我不明白??你为什么需要正则表达式呢indexOf方法也可以接受它应该开始搜索的位置,因此每次找到想要的内容时,都要在该位置之后开始搜索。对于一般字符串,这个问题是不明确的。考虑字符串“XNNEXNEX”。你认为计数是1还是2?考虑字符串“XNNEXNEX”,我会认为这是2,谢谢你,大声喧哗的护士?大声喧哗的护士?我不明白
indexOf
version的+1
Pattern
/
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
。我添加的字符(句点)不能作为匹配的一部分。在本例中,是的,我更多地讨论了一般解决方案。