2013-04-02 41 views
4

我想使用模式匹配从Java中的字符串中消除所有单个字母单词。我编码如下:使用java模式匹配去除单个字母单词

String str = "[email protected]"; 

    //remove single char words and extra white spaces 
    inputStr = inputStr.replaceAll("\\b[\\w']{1}\\b", "").replaceAll("\\s+", " ").trim(); 

我期待输出为P @,因为输入不是单个字母的单词。但我得到的输出为@因为它消除了P.所以基本上它只考虑匹配模式的字母字符。而我想根据输入字符串的长度进行匹配。

请帮忙。

+0

问题似乎是'\ b',它不会将@作为字母计数。 – brimborium

回答

0

使用此

str = str.replaceAll("(^.$|\\s.\\s|^.\\s|\\s.$)", "").replaceAll("\\s+", " ").trim(); 

与解决方案的问题是,你使用\b这是在年底字开始期待一个字符所以它不是你的情况的工作。

/b

匹配词字符(任何由\ W匹配的)和非字字符(任何由[^ \ w]或\ W匹配的),以及在开始和之间的位置/或字符串的结尾,如果字符串中的第一个和/或最后一个字符是单词字符。

REFER FOR REGULAR EXPRESSION

+0

这不是一个完整的解决方案。它仅适用于上述示例的解决方案。因为如果我将字符串更改为“P”,这将保持原样。但正如我所说,我想消除单个字母的单词。 – paras2682

+0

此解决方案不考虑不包含在空格中的单词。 (例如字符串的开始/结尾处的单词,或者以逗号或句点结尾的单词)。 – brimborium

+0

@brimborium OP提到他需要考虑字符串的实际长度,包括其他字符。 – Meherzad

2

尝试使用这样的:

 String data = "asd df R# $R $$ $ 435 4ee 4"; 

    String replaceAll = data.replaceAll("(\\s.\\s)|(\\s.$)", " "); 
    System.out.println(replaceAll); 

输出是:asd df R# $R $$ 435 4ee

0

试试这个正则表达式:

\s([^\s]{1})\s 

应该抓住单个字符非空白,通过分隔两边都有空白。如果您需要接受非空白字符(如','和'。')。作为分隔符,您需要添加这些分隔符。

0

测试用例是:

ASD DF R·$ R $ $$ 435 4EE 4哎哥们这是一个测试I @想

"[!-~]?\\b[A-z]\\b[!-~]?" 
"[!-~]?\\b[\\w]\\b[!-~]?" 

输出上面的代码是:

ASD DF $$ $ 435 4EE 4嘿,伙计,这是测试想
ASD DF $$ $ 435 4EE嘿,伙计日是测试通缉

注意,在第二个失踪的四个。第二个正则表达式排除数字不知道是否计算单个数字

相关问题