替换匹配正则表达式的子字符串。

6

我获取了一些HTML并进行了一些字符串操作,最终得到了一个类似于以下的字符串:

string sample = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n"

我希望找到所有的配料并去除空格和换行符。

2 dl面粉4杯糖

目前我的方法如下。

Pattern p = Pattern.compile("[\\d]+[\\s\\w\\.]+");
Matcher m = p.matcher(Result);

while(m.find()) {
  // This is where i need help to remove those pesky whitespaces
}
6个回答

4

sample = sample.replaceAll("[\\n ]+", " ").trim();

输出:

2 dl. 面粉 4 杯糖

开头和结尾没有空格。

它首先将所有空格和换行符替换为单个空格,然后从开头/结尾修剪多余的空格。


3

以下代码应该适用于您:

String sample = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n";
Pattern p = Pattern.compile("(\\s+)");
Matcher m = p.matcher(sample);
sb = new StringBuffer();
while(m.find())
    m.appendReplacement(sb, " ");
m.appendTail(sb);
System.out.println("Final: [" + sb.toString().trim() + ']');

输出

Final: [2 dl. flour 4 cups of sugar]

你的解决方案正是我需要的,明天我会尝试一下。顺便说一句,\n已经包含在\s中了,所以你的模式只需要使用[\s]+即可。 - Flexo
为什么不像其他人一样使用replaceAll()呢? - Alan Moore
是的,也可以使用replaceAll()方法,但是原始问题提出者想要使用Pattern/Matcher类来实现,所以编写了相应的代码。 - anubhava
实际上,我使用模式/匹配器的原因是字符串中还包含其他内容,但这就是实际的食谱。我只想格式化配料,以便它们可以呈现成一个漂亮的列表。 - Flexo

1
我认为这样的代码对你有用:

我认为这样的代码对你有用:

String test = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n";

/* convert all sequences of whitespace into a single space, and trim the ends */
test = test.replaceAll("\\s+", " ");

1

我假设\n不是实际的换行符,但它也可以与linefeeds一起使用。 这应该正常工作:

test=test.replaceAll("(?:\\s|\\\n)+"," ");

如果没有textual \n,则可能更简单:

test=test.replaceAll("\\s+"," ");

还需要修剪前导/尾随空格。

我使用RegexBuddy工具检查任何单个正则表达式,在许多语言中非常方便。


为了匹配字面序列“\n”(反斜杠+“n”),您需要在正则表达式中使用四个反斜杠(\\\\n),而不是三个。但很明显,OP实际上是想匹配换行符。 - Alan Moore

0

这就是我需要正则表达式变量的地方,但我不太知道如何使用它们。让我举个例子:我的模式匹配 "\n \n 2 \n \n \ndl. \n \n \n flour\n\n \n",我想用 "2 dl. flour" 替换它。我的问题是如何从匹配的子字符串中提取信息? - Flexo
@Flexo,看我的回复,它正是这样做的。 - Kaj

0
s/^\s+//s
s/\s+$//s
s/(\s+)/ /s

运行这三个替换(将前导空格替换为空白,将尾随空格替换为空白,将多个空格替换为一个空格)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接