java中用于匹配和拆分字符串的正则表达式模式

java中用于匹配和拆分字符串的正则表达式模式,java,android,regex,string,Java,Android,Regex,String,我有这个输入字符串 Click ##$#here||action1#$## to do action A and Click ##$#here||action2#$## to do action B and Click ##$#here||action3#$## to do action C 我需要输出strnig作为 Click here to do action A and Click here to do action B and Click here to do action C

我有这个输入字符串

Click ##$#here||action1#$## to do action A
and Click ##$#here||action2#$## to do action B 
and Click ##$#here||action3#$## to do action C
我需要输出strnig作为

Click here to do action A
and Click here to do action B
and Click here to do action C
##$#here | | action 1#$###是一种操作码模式,其中“here”是替换字符串,替换整个操作码模式,“action 1”是用户单击“here”字符串(超链接)时必须执行的基本操作

尝试

上面的代码使用以下字符串设置testTV

Click here to do action A
and Click ##$#here||action2#$## to do action B 
and Click ##$#here||action3#$## to do action C

Click ##$#here||action1#$## to do action A
and Click here to do action B 
and Click ##$#here||action3#$## to do action C

Click ##$#here||action1#$## to do action A
and Click ##$#here||action2#$## to do action B 
and Click here to do action C

任何帮助或建议都将不胜感激

以下正则表达式将执行此操作:

##\$#(.*?)\|\|action\d+#\$##
您可以像这样使用
replaceAll()
方法:

str.replaceAll("##\\$#(.*?)\\|\\|action\\d+#\\$##", "$1")
Pattern p = Pattern.compile("##\\$#(.*?)\\|\\|(.*?)#\\$##");
Matcher m = p.matcher(msg);
int prevEnd;
for (prevEnd = 0; m.find(); prevEnd = m.end()) {
    String plainText = msg.substring(prevEnd, m.start());
    String linkText = m.group(1);
    String action = m.group(2);

    SpannableString ss = new SpannableString(plainText + linkText);
    ClickableSpan clickableSpan = new ClickableSpan() {
        // code here
    };
    ss.setSpan(clickableSpan, plainText.length(), ss.length(),
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    testTV.append(ss);
    testTV.setMovementMethod(LinkMovementMethod.getInstance());
}
if (prevEnd < msg.length()) {
    testTV.append(msg.substring(prevEnd));
}
看这个


更新

问题是,在每次迭代
find()
时,都会将整个
msg
追加到
textTV
。你需要逐步地建立它

大概是这样的:

str.replaceAll("##\\$#(.*?)\\|\\|action\\d+#\\$##", "$1")
Pattern p = Pattern.compile("##\\$#(.*?)\\|\\|(.*?)#\\$##");
Matcher m = p.matcher(msg);
int prevEnd;
for (prevEnd = 0; m.find(); prevEnd = m.end()) {
    String plainText = msg.substring(prevEnd, m.start());
    String linkText = m.group(1);
    String action = m.group(2);

    SpannableString ss = new SpannableString(plainText + linkText);
    ClickableSpan clickableSpan = new ClickableSpan() {
        // code here
    };
    ss.setSpan(clickableSpan, plainText.length(), ss.length(),
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    testTV.append(ss);
    testTV.setMovementMethod(LinkMovementMethod.getInstance());
}
if (prevEnd < msg.length()) {
    testTV.append(msg.substring(prevEnd));
}
Pattern p=Pattern.compile(“\\\$\\\$”(.*?\\\\\\\\\\\\\\\\\\\\\(.*?)\”;
匹配器m=p.Matcher(msg);
int prevEnd;
for(prevEnd=0;m.find();prevEnd=m.end()){
String plainText=msg.substring(prevEnd,m.start());
字符串linkText=m.group(1);
串动作=m组(2);
SpannableString ss=新的SpannableString(纯文本+链接文本);
ClickableSpan ClickableSpan=新的ClickableSpan(){
//代码在这里
};
ss.setSpan(可点击span,明文.length(),ss.length(),
SPAN_独占性SPAN_独占性);
testTV.append(ss);
setMovementMethod(LinkMovementMethod.getInstance());
}
if(prevEnd
以下正则表达式将执行此操作:

##\$#(.*?)\|\|action\d+#\$##
您可以像这样使用
replaceAll()
方法:

str.replaceAll("##\\$#(.*?)\\|\\|action\\d+#\\$##", "$1")
Pattern p = Pattern.compile("##\\$#(.*?)\\|\\|(.*?)#\\$##");
Matcher m = p.matcher(msg);
int prevEnd;
for (prevEnd = 0; m.find(); prevEnd = m.end()) {
    String plainText = msg.substring(prevEnd, m.start());
    String linkText = m.group(1);
    String action = m.group(2);

    SpannableString ss = new SpannableString(plainText + linkText);
    ClickableSpan clickableSpan = new ClickableSpan() {
        // code here
    };
    ss.setSpan(clickableSpan, plainText.length(), ss.length(),
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    testTV.append(ss);
    testTV.setMovementMethod(LinkMovementMethod.getInstance());
}
if (prevEnd < msg.length()) {
    testTV.append(msg.substring(prevEnd));
}
看这个


更新

问题是,在每次迭代
find()
时,都会将整个
msg
追加到
textTV
。你需要逐步地建立它

大概是这样的:

str.replaceAll("##\\$#(.*?)\\|\\|action\\d+#\\$##", "$1")
Pattern p = Pattern.compile("##\\$#(.*?)\\|\\|(.*?)#\\$##");
Matcher m = p.matcher(msg);
int prevEnd;
for (prevEnd = 0; m.find(); prevEnd = m.end()) {
    String plainText = msg.substring(prevEnd, m.start());
    String linkText = m.group(1);
    String action = m.group(2);

    SpannableString ss = new SpannableString(plainText + linkText);
    ClickableSpan clickableSpan = new ClickableSpan() {
        // code here
    };
    ss.setSpan(clickableSpan, plainText.length(), ss.length(),
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    testTV.append(ss);
    testTV.setMovementMethod(LinkMovementMethod.getInstance());
}
if (prevEnd < msg.length()) {
    testTV.append(msg.substring(prevEnd));
}
Pattern p=Pattern.compile(“\\\$\\\$”(.*?\\\\\\\\\\\\\\\\\\\\\(.*?)\”;
匹配器m=p.Matcher(msg);
int prevEnd;
for(prevEnd=0;m.find();prevEnd=m.end()){
String plainText=msg.substring(prevEnd,m.start());
字符串linkText=m.group(1);
串动作=m组(2);
SpannableString ss=新的SpannableString(纯文本+链接文本);
ClickableSpan ClickableSpan=新的ClickableSpan(){
//代码在这里
};
ss.setSpan(可点击span,明文.length(),ss.length(),
SPAN_独占性SPAN_独占性);
testTV.append(ss);
setMovementMethod(LinkMovementMethod.getInstance());
}
if(prevEnd
您可以尝试在循环内的字符串msg中分配更新后的值,如
msg=display在语句之后

String display = msg.replace(pattern1 + action + pattern2, replaceAction[0]);

您可以尝试在循环内的字符串msg中指定更新后的值,如
msg=display在语句之后

String display = msg.replace(pattern1 + action + pattern2, replaceAction[0]);

经过一个小时的实验,我发现有效的解决方案是

    String regexString = Pattern.quote(pattern1) + "(.*?)" + "\\|\\|" + "(.*?)" + Pattern.quote(pattern2);
    Pattern pattern = Pattern.compile(regexString);
    Matcher matcher = pattern.matcher(msg);

    while (matcher.find()) {
        String replace = matcher.group(1); //Replacement string
        String action = matcher.group(2);  //Action String

        msg = msg.replaceFirst(regexString, replace);
    }

Log.e ("Display Message", msg);

经过一个小时的实验,我发现有效的解决方案是

    String regexString = Pattern.quote(pattern1) + "(.*?)" + "\\|\\|" + "(.*?)" + Pattern.quote(pattern2);
    Pattern pattern = Pattern.compile(regexString);
    Matcher matcher = pattern.matcher(msg);

    while (matcher.find()) {
        String replace = matcher.group(1); //Replacement string
        String action = matcher.group(2);  //Action String

        msg = msg.replaceFirst(regexString, replace);
    }

Log.e ("Display Message", msg);

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>应该可以用于模式匹配。我已经添加了尝试过的代码。请再次检查为什么不使用替换API将子字符串替换为新字符串?为什么这里需要一个模式选择?我想我通过匹配和吐痰得到了正确的选择。但问题似乎是在textView中添加文本消息。我怎样才能把它弄对呢。正如我在上面的例子中所做的那样,
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>应该可以用于模式匹配。我已经添加了尝试过的代码。请再次检查为什么不使用替换API将子字符串替换为新字符串?为什么这里需要一个模式选择?我想我通过匹配和吐痰得到了正确的选择。但问题似乎是在textView中添加文本消息。我怎样才能把它弄对呢。就像我在上面的例子中所做的那样?我感谢你的帮助。但是,##$#(.*?| | | | | action\d+#$##并不是我想要的模式。B'cos、replace_字符串和action可以是unicode中的任何字符。实际模式如下所示##$#替换|字符串|操作|字符串#$##顺便问一下,参数$1表示(.*)吗?@SamuelRobert正确。我很感谢你的帮助。但是,##$#(.*?| | | | | action\d+#$##并不是我想要的模式。B'cos、replace_字符串和action可以是unicode中的任何字符。实际模式如下所示##$#替换|字符串|操作|字符串#$##顺便问一下,参数$1表示(.*)吗?@SamuelRobert正确。看到了吗,巴迪-(这对巴迪没有帮助……:-(这基本上就是我建议你做的。这个想法是,因为替换只起作用了一次,所以你用替换后的正则表达式替换原始消息字符串。但是,无论哪种方式对你有效都可以。这基本上就是我建议你做的。这个想法是,因为替换起作用了。)有一次,您用替换后的正则表达式替换原始消息字符串。但是,无论哪种方法对您有效都可以。