在识别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
。谁能说怎么做呢?
答案 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
来捕获这些标记。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
如果这对您有用,请告诉我