Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式替换子字符串_Java_Regex_Substring - Fatal编程技术网

Java 使用正则表达式替换子字符串

Java 使用正则表达式替换子字符串,java,regex,substring,Java,Regex,Substring,我有一个字符串,其中包含许多值 我想检索中的值,进行一些操作并将新值重新插入字符串 我所做的是 input = This is <abc_d> a sample <ea1_j> input <lmk_02> string while(input.matches(".*<.+[\S][^<]>.*")) { value = input.substring(input.indexOf("<") + 1, input.indexOf("

我有一个字符串,其中包含许多

我想检索
中的值,进行一些操作并将新值重新插入字符串

我所做的是

input = This is <abc_d> a sample <ea1_j> input <lmk_02> string
while(input.matches(".*<.+[\S][^<]>.*"))
{
   value = input.substring(input.indexOf("<") + 1, input.indexOf(">"));
   //calculate manipulatedValue from value
   input = input.replaceFirst("<.+>", manipulatedValue);
}
input=这是一个示例输入字符串

while(input.matches(“.*”)将给出第一个索引“>”。我哪里出错了?

尝试对正则表达式使用转义字符。

尝试对正则表达式使用转义字符。

这是一种稍微简单一些的方法,可以完成您尝试执行的操作:

String input = "This is <abc_d> a sample <ea1_j> input <lmk_02> string";
Matcher matcher = Pattern.compile("<([^>]*)>").matcher(input);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, manipulateValue(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
String input=“这是一个示例输入字符串”;
Matcher Matcher=Pattern.compile(“]*)>”).Matcher(输入);
StringBuffer sb=新的StringBuffer();
while(matcher.find()){
匹配器阑尾置换术(sb,操纵值)(匹配器组(1));
}
(某人);
System.out.println(sb.toString());

这是一种稍微简单一点的方法来完成您想要做的事情:

String input = "This is <abc_d> a sample <ea1_j> input <lmk_02> string";
Matcher matcher = Pattern.compile("<([^>]*)>").matcher(input);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, manipulateValue(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
String input=“这是一个示例输入字符串”;
Matcher Matcher=Pattern.compile(“]*)>”).Matcher(输入);
StringBuffer sb=新的StringBuffer();
while(matcher.find()){
匹配器阑尾置换术(sb,操纵值)(匹配器组(1));
}
(某人);
System.out.println(sb.toString());

这是
appendReplacement
appendTail
习惯用法的一个很好的用例:

Pattern p = Pattern.compile("<([^>]+)>");
Matcher m = p.matcher(input);
StringBuffer out = new StringBuffer():
while(m.find()) {
  String value = m.group(1);
  // calculate manipulatedValue
  m.appendReplacement(out, Matcher.quoteReplacement(manipulatedValue));
}
m.appendTail(out);
Pattern p=Pattern.compile(“]+)>”;
匹配器m=p.Matcher(输入);
StringBuffer out=新的StringBuffer():
while(m.find()){
字符串值=m.group(1);
//计算操纵值
m、 附录替换(out,Matcher.quoteReplacement(操纵值));
}
m、 附尾(外);

这是
appendReplacement
appendTail
习惯用法的一个很好的用例:

Pattern p = Pattern.compile("<([^>]+)>");
Matcher m = p.matcher(input);
StringBuffer out = new StringBuffer():
while(m.find()) {
  String value = m.group(1);
  // calculate manipulatedValue
  m.appendReplacement(out, Matcher.quoteReplacement(manipulatedValue));
}
m.appendTail(out);
Pattern p=Pattern.compile(“]+)>”;
匹配器m=p.Matcher(输入);
StringBuffer out=新的StringBuffer():
while(m.find()){
字符串值=m.group(1);
//计算操纵值
m、 附录替换(out,Matcher.quoteReplacement(操纵值));
}
m、 附尾(外);

在正则表达式中,转义字符应该在哪一点起作用?另外,您还应该提到转义字符必须成对出现在Java正则表达式中。转义字符在正则表达式中应该在哪一点上起作用?另外,您应该提到转义字符必须成对出现在Java正则表达式中。在这里使用StringBuilder是更好的选择,但如果您的解决方案看起来不错,请向上投票。@MichaelSchmeißer:如果
matcher.appendReplacement()
接受
StringBuilder
作为参数,我会使用它。哦,我明白了。我没有意识到这一点(我认为这也有点奇怪),所以我想你的答案没有什么可以改进的@MichaelSchmeißer:是的,这有点奇怪,这似乎是一个使用
StringBuilder
的完美地方,但我猜他们不想扩展
Matcher
API。根据我的回答,您可能需要在替换字符串上使用
Matcher.quoteReplacement
appendReplacement
允许像
$1
这样的反向引用在替换中包括匹配的组(例如
]*)>
和替换字符串
=$1=
更改为
=foo=
)。如果要在替换字符串中使用文字
$
,则必须将其转义为
\$
,因此,如果要使用必须加倍的文字反斜杠。
quoteReplacement
方法为您进行这些替换。StringBuilder将是此处使用的更好选项,但如果您的解决方案看起来不错,请向上投票。@MichaelSchmeißer:如果
matcher.appendReplacement()
接受
StringBuilder
作为参数,我会使用它。哦,我明白了。我没有意识到这一点(我认为这也有点奇怪),所以我想你的答案没有什么可以改进的@MichaelSchmeißer:是的,这有点奇怪,这似乎是一个使用
StringBuilder
的完美地方,但我猜他们不想扩展
Matcher
API。根据我的回答,您可能需要在替换字符串上使用
Matcher.quoteReplacement
appendReplacement
允许像
$1
这样的反向引用在替换中包括匹配的组(例如
]*)>
和替换字符串
=$1=
更改为
=foo=
)。如果要在替换字符串中使用文字
$
,则必须将其转义为
\$
,因此,如果要使用必须加倍的文字反斜杠。
quoteReplacement
方法为您执行这些替换。