java正则表达式 - 搜索两个搜索字符之间的空内容
我是新来的java正则表达式。java正则表达式 - 搜索两个搜索字符之间的空内容
对不起,发布时间过长。
我有三个要求:
1A),我有一个包含单词“TEST”三个OCCURENCES的字符串。这个单词后面跟着^,我需要检查^的第2次和第3次出现之间的内容是否为空,如果是空白/空进一步搜索,以查看第5次和第6次出现^之间的内容是“” 如果是 “”,则更换它是空白/空 实施例: 现有字符串:
aaaa^
TEST^x^^y^z^""^cccc^bbb^
预期字符串:
aaaa^
TEST^x^^y^z^^cccc^bbb^
1b)中如果第二和第三之间的内容^的发生不是空白而不是“”,那么不要改变第5次和第6次发生的内容
现有的字符串:
TEST^p^^q^r^""^lll^mmm^
期望的字符串:
TEST^p^^q^r^""^lll^mmm^
我需要重复时的测试字中发现这个逻辑检查。如果第5到第6次出现^的内容不是空白而不是“”,如果第2次和第3次之间的内容是空白/空白,则用STR代替它。
现有的字符串:
TEST^g^^q^r^YYY^lll^mmm^
期望的字符串:
TEST^g^STR^q^r^YYY^lll^mmm^
我需要完成ALLT他上面一个Java正则表达式的情况。根据我以前在此论坛发帖的宝贵意见,我可以使案例1工作。我无法让案例2和案例3工作。
如何在相同的正则表达式中完成情况2和3(我不确定正则表达式对于非空的contnet check和'OR'检查)是什么。 在非正则表达式的世界里,在平原,如果别的办法,我可以按如下照顾的三种情况:
if (the content between 2nd and 3rd occurence of^is empty)
{
if(content between 5th and 6th occurence of^is "")
{
make this content empty
}
else
{
set the content between 2nd and 3rd occurence of^as STR
}
}
但因为我需要进行这项检查对于每个字TEST开始在串线,我倾向于正则表达式。
到目前为止,对于情况1的工作正则表达式如下:
str.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"", "$1")
对于第二种情况,我试着修改上述正则表达式如下却徒劳无功(试图寻找之间的第2和不为空值3RD OCCURENCE这里我以为*\\d0$
代表空[\\d0$]
意味着不为空):
str.replaceAll("(TEST\\^[^^]*\\^[^\\d0$]\\^[^^]*\\^[^^]*\\^)\"\"", "$1")
任何帮助来与正则表达式,负责上述3个usecases的高度赞赏,因为我有一个最后期限,以满足 这个任务。
任何帮助,高度赞赏。
在此先感谢。
我先试着解决你的(1b)问题。我很抱歉,但我想你忘记提及(1b)中应该采取什么行动,如果第二次和第三次发生^ IS BLANK之间的内容。
1B)在第2和^ 3日occurence之间的内容不为空,而不是 “”,然后不改变
1b usecase - 如果它是空白/空,请忽略。 – 2010-09-24 15:40:43
1b usecase - 如果它是空白/空的忽略=>没有chnages要完成。 – 2010-09-24 16:10:58
在我看来第五ANC 6 occurence之间的内容,即^
是一个分隔符。因此,它可以使生活更容易,如果你只是在分割的分隔符字符串,并与阵列工作:
List<String> lines = FileUtils(myFile, myEncoding);
List<String[]> allValues = new ArrayList<String[]>();
for (String line: lines)
allValues.add(line.split("\\^"));
上面的例子显示使用Apache的公地IO处理整个csv文件的方法。
我已更新您的新要求的代码。 ^和|在正则表达式中都有特殊的含义,所以如果你的分隔符是特殊字符之一,那么需要更仔细地处理它。新的代码是
public class Main {
public static void main(String[] args) {
System.out.println(replace("TEST^x^^y^z^\"\"^cccc^bbb^", '^'));//case 1a
System.out.println(replace("TEST^x^^y^z^\"\"Something^cccc^bbb^", '^'));//case 1a
System.out.println(replace("TEST^x^^y^z^Something\"\"^cccc^bbb^", '^'));//case 1a
System.out.println(replace("TEST^x^Something^y^z^\"\"^cccc^bbb^", '^'));//case 1b
System.out.println(replace("TEST^x^^y^z^\"Something\"^cccc^bbb^", '^'));//case 1c
System.out.println(replace("TEST|x||y|z|\"\"|cccc|bbb|", '|'));//case 1a
System.out.println(replace("TEST|x||y|z|\"\"Something|cccc|bbb|", '|'));//case 1a
System.out.println(replace("TEST|x||y|z|Something\"\"|cccc|bbb|", '|'));//case 1a
System.out.println(replace("TEST|x|Something|y|z|\"\"|cccc|bbb|", '|'));//case 1b
System.out.println(replace("TEST|x||y|z|\"Something\"|cccc|bbb|", '|'));//case 1c
}
/*
private static String replace(String in) {
String intermediateResult = in.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\\^", "$1^");
String finalResult = intermediateResult.replaceAll(
"(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^([^\"\\^].*|\"[^\"].*))", "$1STR$2");
return finalResult;
}*/
private static String replace(String in, char deliminator) {
String delim = "\\"+deliminator;
String intermediateResult = in.replaceAll(
"(TEST" + delim +
"[^" + delim + "]*" +
delim + delim +
"[^" + delim + "]*" + delim +
"[^" + delim + "]*" + delim +
")\"\"" + delim,
"$1"+deliminator);
String finalResult = intermediateResult.replaceAll(
"(TEST" + delim +
"[^" + delim + "]*"
+ delim + ")(" + delim +
"[^" + delim + "]*" + delim +
"[^" + delim + "]*" + delim +
"([^\"" + delim + "].*|\"[^\"].*))", "$1STR$2");
return finalResult;
}
}
输出
TEST^x^^y^z^^cccc^bbb^
TEST^x^^y^z^""Something^cccc^bbb^
TEST^x^STR^y^z^Something""^cccc^bbb^
TEST^x^Something^y^z^""^cccc^bbb^
TEST^x^STR^y^z^"Something"^cccc^bbb^
TEST|x||y|z||cccc|bbb|
TEST|x||y|z|""Something|cccc|bbb|
TEST|x|STR|y|z|Something""|cccc|bbb|
TEST|x|Something|y|z|""|cccc|bbb|
TEST|x|STR|y|z|"Something"|cccc|bbb|
我的建议是去http://www.regular-expressions.info/了解它。 – Hemang 2010-09-24 23:07:59
谢谢。我讨厌问,但^与搜索字符串^的重要性如何。当搜索字符是^时它工作正常,但当搜索字符是|时失败(我试过\\ |但徒劳无功)。我的意思是我需要让它在这种情况下工作 - TEST | x || y | z || cccc | bbb |。提前致谢。 – 2010-09-25 03:16:22
我试图让正则表达式工作在1a场景(TEST | x ||||“”| ccc |)的情况下搜索字面为|但必须执行以下操作:字符串intermediateResult = in.replaceAll( “(TEST \\\\ | [\\ | \\ |] * \\\\ | \\\\ | [\\ | \\ |]] * \\\\ | [\\ | \\ |] * \\\\ |)\“\”\\ |“, ”$ 1 \\ |“);但是,如果我使用\\ |,我不明白它为什么需要\\\\ |搜索文字?根据我的截止日期,我希望自己有足够的时间在正则表达式方面做得更好。 – 2010-09-25 05:14:41
不要使用正则表达式来解析这个使用拆分如
var arr;
arr=str.split("\^","g");
,并执行你的每一个合适的描述逻辑项目在结果数组中。
道歉,如果我的Java语法不正确!
可能重复的[java正则表达式搜索替换问题](http://*.com/questions/3782522/java-regex-search-replace-issue) – zigdon 2010-09-24 05:40:18
你的1a和1b的例子字符串是等价的 - 差异在哪里?像“TEST^x ^”“^ y^z ^”“^ aaa'这样的字符串应该发生什么? – 2010-09-26 15:17:45
你可能应该编辑你的原始问题,而不是开始一个新的问题。但现在可能太迟了。 – 2010-09-27 15:55:45