java正则表达式或其他在字符串和该字符串的其他部分之间查找字符串的方法

java正则表达式或其他在字符串和该字符串的其他部分之间查找字符串的方法,java,regex,string,Java,Regex,String,我有一根这样的绳子 String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ; public static void main(String[] args) throws java.lang.Exception { String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO"; Str

我有一根这样的绳子

String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ;
public static void main(String[] args) throws java.lang.Exception {
    String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
    String matchedString = null;
    List<String> extractedString = new ArrayList<String>();
    Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
    Matcher m = p.matcher(s);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {

        matchedString = m.group(1);
        extractedString.add(matchedString);
        m.appendReplacement(sb, matchedString);
        sb.append(" ");

    }
    m.appendTail(sb);

    System.out.println(sb.toString());
    System.out.println(extractedString.toString());
}
Output :
String buffer = AZERTYZA  QWERTY OK NE NO
List of extracted String = [ZA, NE]
我的正则表达式可以提取所需的字符串,但我不知道如何使用正确的顺序构造StringBuilder:/

Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
            Matcher m = p.matcher(value);
            while(m.find())
            {
                m.group(1); //extracts
            }
Pattern p=Pattern.compile(“\\(.*?\”)\”;
匹配器m=p.Matcher(值);
while(m.find())
{
m、 组(1);//摘录
}
非常感谢

您可以使用appendReplacement(StringBuffer sb,String replacement)和appendTail(StringBuffer sb)函数使其保持有序。并有一个列表来存储提取的字符串。像这样的

String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ;
String[] pieces = s.split("<.*?>")
public static void main(String[] args) throws java.lang.Exception {
    String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
    String matchedString = null;
    List<String> extractedString = new ArrayList<String>();
    Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
    Matcher m = p.matcher(s);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {

        matchedString = m.group(1);
        extractedString.add(matchedString);
        m.appendReplacement(sb, matchedString);
        sb.append(" ");

    }
    m.appendTail(sb);

    System.out.println(sb.toString());
    System.out.println(extractedString.toString());
}
Output :
String buffer = AZERTYZA  QWERTY OK NE NO
List of extracted String = [ZA, NE]
publicstaticvoidmain(字符串[]args)抛出java.lang.Exception{
字符串s=“AZERTYZA QWERTY OK NENO”;
字符串matchedString=null;
List extractedString=new ArrayList();
Pattern p=Pattern.compile(“\\(.*?\”);
匹配器m=匹配器p;
StringBuffer sb=新的StringBuffer();
while(m.find()){
matchedString=m.group(1);
extractedString.add(matchedString);
m、 附录替换(sb,匹配字符串);
某人加上(“”);
}
m、 (某人);
System.out.println(sb.toString());
System.out.println(extractedString.toString());
}
输出:
字符串缓冲区=AZERTYZA QWERTY OK NE NO
提取字符串的列表=[ZA,NE]
您可以使用appendReplacement(StringBuffer sb,String replacement)和appendTail(StringBuffer sb)函数使其保持有序。并有一个列表来存储提取的字符串。像这样的

String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ;
public static void main(String[] args) throws java.lang.Exception {
    String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
    String matchedString = null;
    List<String> extractedString = new ArrayList<String>();
    Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
    Matcher m = p.matcher(s);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {

        matchedString = m.group(1);
        extractedString.add(matchedString);
        m.appendReplacement(sb, matchedString);
        sb.append(" ");

    }
    m.appendTail(sb);

    System.out.println(sb.toString());
    System.out.println(extractedString.toString());
}
Output :
String buffer = AZERTYZA  QWERTY OK NE NO
List of extracted String = [ZA, NE]
publicstaticvoidmain(字符串[]args)抛出java.lang.Exception{
字符串s=“AZERTYZA QWERTY OK NENO”;
字符串matchedString=null;
List extractedString=new ArrayList();
Pattern p=Pattern.compile(“\\(.*?\”);
匹配器m=匹配器p;
StringBuffer sb=新的StringBuffer();
while(m.find()){
matchedString=m.group(1);
extractedString.add(matchedString);
m、 附录替换(sb,匹配字符串);
某人加上(“”);
}
m、 (某人);
System.out.println(sb.toString());
System.out.println(extractedString.toString());
}
输出:
字符串缓冲区=AZERTYZA QWERTY OK NE NO
提取字符串的列表=[ZA,NE]

您需要执行以下操作:

        String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
        StringBuilder stringBuilder = new StringBuilder();
        String[] parts = str.split("(<\\/?em>)");

        System.out.println("parts : "+Arrays.toString(parts));

        for(String s:parts){
            System.out.println("Part going to append :"+s);
            stringBuilder.append(s);
        }
        System.out.println("StringBuilder : "+stringBuilder.toString());
    }
更新:--

检查更新的代码:

String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";

        //replace word in string which is preceded by <\em> to word:font eg. ZA:font
        str = str.replaceAll("(\\w+)(?=\\<\\/em\\>)", "$1:font");
   // After replace :AZERTY<em>ZA:font</em> QWERTY OK <em>NE:font</em>NO

        String[] parts = str.split("(<\\/?em>)");
 // After split : [AZERTY, ZA:font,  QWERTY OK , NE:font, NO]   

        XSSFRichTextString xssfrt = new XSSFRichTextString();

        for(String s:parts){
            //set font according to replace string
            if(s.contains(":")){
                String[] subParts = s.split(":");
                xssfrt.append(subParts[0], /**check the subParts[0] and set the font***/ );
            }else{
                xssfrt.append(s);
            }
        }
    }
String str=“AZERTYZA QWERTY OK NENO”;
//替换字符串中的单词,该字符串前面是to-word:font,例如ZA:font
str=str.replaceAll(“(\\w+)(=\\)”,“$1:font”);
//替换后:AZERTYZA:font QWERTY OK NE:fontNO
String[]parts=str.split(());
//拆分后:[AZERTY,ZA:font,QWERTY OK,NE:font,NO]
XSSFRichTextString xssfrt=新的XSSFRichTextString();
用于(字符串s:零件){
//根据替换字符串设置字体
如果(s)包含(“:”){
字符串[]子部分=s.split(“:”);
xssfrt.append(子部分[0],/**检查子部分[0]并设置字体***/);
}否则{
xssfrt.append(s);
}
}
}

您需要执行以下操作:

        String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
        StringBuilder stringBuilder = new StringBuilder();
        String[] parts = str.split("(<\\/?em>)");

        System.out.println("parts : "+Arrays.toString(parts));

        for(String s:parts){
            System.out.println("Part going to append :"+s);
            stringBuilder.append(s);
        }
        System.out.println("StringBuilder : "+stringBuilder.toString());
    }
更新:--

检查更新的代码:

String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";

        //replace word in string which is preceded by <\em> to word:font eg. ZA:font
        str = str.replaceAll("(\\w+)(?=\\<\\/em\\>)", "$1:font");
   // After replace :AZERTY<em>ZA:font</em> QWERTY OK <em>NE:font</em>NO

        String[] parts = str.split("(<\\/?em>)");
 // After split : [AZERTY, ZA:font,  QWERTY OK , NE:font, NO]   

        XSSFRichTextString xssfrt = new XSSFRichTextString();

        for(String s:parts){
            //set font according to replace string
            if(s.contains(":")){
                String[] subParts = s.split(":");
                xssfrt.append(subParts[0], /**check the subParts[0] and set the font***/ );
            }else{
                xssfrt.append(s);
            }
        }
    }
String str=“AZERTYZA QWERTY OK NENO”;
//替换字符串中的单词,该字符串前面是to-word:font,例如ZA:font
str=str.replaceAll(“(\\w+)(=\\)”,“$1:font”);
//替换后:AZERTYZA:font QWERTY OK NE:fontNO
String[]parts=str.split(());
//拆分后:[AZERTY,ZA:font,QWERTY OK,NE:font,NO]
XSSFRichTextString xssfrt=新的XSSFRichTextString();
用于(字符串s:零件){
//根据替换字符串设置字体
如果(s)包含(“:”){
字符串[]子部分=s.split(“:”);
xssfrt.append(子部分[0],/**检查子部分[0]并设置字体***/);
}否则{
xssfrt.append(s);
}
}
}

一个简单的解决方法是在
之前添加另一个组以匹配字符串:

Pattern p=Pattern.compile((*?)(*?);
有了它,
m.group(1)
指的是
em
之外的字符串,
m.group(2)
指的是里面的字符串


当然,这不会包括
em
之外的最后一个字符串(在您的示例中为
NO
)。因此,您可能希望记住匹配以结尾的最后一个索引,例如
int end=m.end()
,然后检索它
s.substring(end)
,一个简单的解决方法是在
之前添加另一个组来匹配字符串:

Pattern p=Pattern.compile((*?)(*?);
有了它,
m.group(1)
指的是
em
之外的字符串,
m.group(2)
指的是里面的字符串


当然,这不会包括
em
之外的最后一个字符串(在您的示例中为
NO
)。因此,您可能希望记住匹配以结尾的最后一个索引,例如
int end=m.end()
,然后检索它
s.substring(end)

谢谢。还有我如何识别其他部分的字符串?谢谢。还有,我如何识别从其他部分提取的字符串?谢谢你的回答,但我需要构造一个字符串生成器,而不是一个简单的字符串,因为我需要识别从其他部分提取的字符串parts@ulquiorra我已经更新了我的答案,请检查它是否解决了您的问题。唯一剩下的是第一个单词和第一个提取的字符串之间并没有空格,我想你们可以处理。我没有广泛使用这些功能,但我认为这是您想要的。谢谢。非常有用:)谢谢你的回答,但我需要构造一个字符串生成器,而不是一个简单的字符串,因为我需要识别从其他字符串中提取的字符串parts@ulquiorra我已经更新了我的答案,请检查它是否解决了您的问题。唯一剩下的是f和f之间没有空间了