将零替换为单词中的“o”

时间:2017-06-19 09:46:27

标签: java regex string

在识别ocr后,我有很多单词而不是o我有0。所以我想替换任何零inside字。

到目前为止,我只能做以下

String result ="I don't like th0se books";
result = result.replaceAll("\\w+0\\w*", "o");
System.out.println("RESULT:" + result);

我的代码返回RESULT:I don't like o books,但我需要RESULT:I don't like those books。谁能说怎么做呢?

6 个答案:

答案 0 :(得分:5)

使用非字边界:

result = result.replaceAll("\\B0|0\\B", "o");

确保在0之前或之后至少有一个单词字符。

如果要防止数字内的零被替换:

result = result.replaceAll("\\b(?!\\d+\\b)(?:0\\B|([^\\W0]+)0)|\\G(?!\\A)0", "$1o");

细节:

\\b              # a word boundary
(?!\\d+\\b)      # negative lookahead: not followed by an integer
(?:
    0\\B         # zero and a non-word boundary (means a word character follows)
  |
    ([^\\W0]+)0  # word characters without zero and a zero
)
|
\\G(?!\\A)0  # a zero contiguous to a previous match (not at the start of the string)

(显然,正则表达式模式不能区分参考号中孤立的“0”和孤立的“o”之间,或“0”和“o”之间的区别,或者科学记数法)

其他方式:捕获所有对手

result = result.replaceAll("((?>(?:[\\W_]+|\\pL+|\\b\\d+\\b)*))(?:\\B0|0\\B)", "$1o");

答案 1 :(得分:2)

正则表达式应为"0"而不是"\\w+0\\w*"

另外,要保留其余单词,请使用捕获组:result = result.replaceAll("(\\w+)0(\\w*)", "$1o$2");

仅替换“字母”并忽略要求的数字:result = result.replaceAll("([a-zA-Z]+)0([a-zA-Z\s0]+)", "$1o$2");

答案 2 :(得分:1)

(\B0\B|\B0|0\B)

匹配三种情况:

  • 0在一个单词的中间,例如" th0se"
  • 0在一个单词的末尾,例如" lid0"
  • 0在一个单词的开头,例如" 0thers"

所以,`result.replaceAll("(\ B0 \ B | \ B0 | 0 \ B)"," o");

但是,这也会将I have 101 dogs替换为I have 1o1 dogs,因此您可能希望进一步优化表达式或逻辑。

虽然可以编写单个正则表达式来实现这一点,但我觉得在普通的Java代码中实现它会更简单,更清晰:

  • 将行拆分为标记(标记可以是一大块空白或一大块非空白 - 您可以使用正则表达式(\s+|\S+)Matcher来捕获这些标记。
  • 每个令牌
    • 如果是空白,请不要理会
    • 如果它完全由数字和符号组成,请单独留下
    • else word.replace('0','o')
    • 输出令牌

答案 3 :(得分:0)

如果您不想使用复杂的正则表达式,您可以迭代字符串并执行相同操作。

char c[] = new char[s.length()];
for(int i=0;i<s.length();i++){
    if(s.charAt(i) == '0'){
        c[i] = 'o';
    }else{
        c[i] = s.charAt(i);
    }
}
 //now convert to string.
s = String.valueOf(c);

仅在words内,您可以查看以下内容:

    String s = "I like th0se b00ks ... 100 pages";
    char c[] = new char[s.length()];
    for(int i=1;i<s.length()-1;i++){
        if(s.charAt(i) == '0' && !Character.isDigit(s.charAt(i+1)) && !Character.isDigit(s.charAt(i-1))){
            c[i] = 'o';
        }else{
            c[i] = s.charAt(i);
        }
    }

    //check corner conditions.
    if(s.length() >=1 && !Character.isDigit(s.charAt(1)) && s.charAt(0) == '0'){
        c[0] = 'o';
    }

    if(s.length() >= 2 &&!Character.isDigit(s.charAt(s.length()-2)) && s.charAt(s.length()-1) == '0'){
        c[s.length()-1] = 'o';
    }

    //now convert to string.
    s = String.valueOf(c);
    System.out.println(s);

答案 4 :(得分:-1)

尝试:result = result.replaceAll("(\\w+)0(\\w+)", "$1o$2");

使用输入:“我不喜欢这些书00 1230”

你得到:“我不喜欢那些书00 1230”

修改

如果您使用:result = result.replaceAll("([a-zA-Z]+)0([a-zA-Z]+)", "$1o$2");,它应该适用于“我不喜欢这些书00 1230 1230456”字符串。

答案 5 :(得分:-3)

您可以使用sed命令并将其作为数组传递给java sed -i s / 0 / o / g filename

-i - 更改保存到新文件

s - 这是搜索

0 - 要搜索的字符

o - 要插入的字符

要检查如何在Java中将sed用作数组,请选中此链接 How to run sed command from java code

如果这对您有用,请告诉我