2010-09-24 54 views
0

我是新来的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的高度赞赏,因为我有一个最后期限,以满足 这个任务。

任何帮助,高度赞赏。

在此先感谢。

+0

可能重复的[java正则表达式搜索替换问题](http://stackoverflow.com/questions/3782522/java-regex-search-replace-issue) – zigdon 2010-09-24 05:40:18

+0

你的1a和1b的例子字符串是等价的 - 差异在哪里?像“TEST^x ^”“^ y^z ^”“^ aaa'这样的字符串应该发生什么? – 2010-09-26 15:17:45

+0

你可能应该编辑你的原始问题,而不是开始一个新的问题。但现在可能太迟了。 – 2010-09-27 15:55:45

回答

0

我先试着解决你的(1b)问题。我很抱歉,但我想你忘记提及(1b)中应该采取什么行动,如果第二次和第三次发生^ IS BLANK之间的内容。

1B)在第2和^ 3日occurence之间的内容不为空,而不是 “”,然后不改变

+0

1b usecase - 如果它是空白/空,请忽略。 – 2010-09-24 15:40:43

+0

1b usecase - 如果它是空白/空的忽略=>没有chnages要完成。 – 2010-09-24 16:10:58

1

在我看来第五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文件的方法。

0

我已更新您的新要求的代码。 ^和|在正则表达式中都有特殊的含义,所以如果你的分隔符是特殊字符之一,那么需要更仔细地处理它。新的代码是

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| 
+0

我的建议是去http://www.regular-expressions.info/了解它。 – Hemang 2010-09-24 23:07:59

+0

谢谢。我讨厌问,但^与搜索字符串^的重要性如何。当搜索字符是^时它工作正常,但当搜索字符是|时失败(我试过\\ |但徒劳无功)。我的意思是我需要让它在这种情况下工作 - TEST | x || y | z || cccc | bbb |。提前致谢。 – 2010-09-25 03:16:22

+0

我试图让正则表达式工作在1a场景(TEST | x ||||“”| ccc |)的情况下搜索字面为|但必须执行以下操作:字符串intermediateResult = in.replaceAll( “(TEST \\\\ | [\\ | \\ |] * \\\\ | \\\\ | [\\ | \\ |]] * \\\\ | [\\ | \\ |] * \\\\ |)\“\”\\ |“, ”$ 1 \\ |“);但是,如果我使用\\ |,我不明白它为什么需要\\\\ |搜索文字?根据我的截止日期,我希望自己有足够的时间在正则表达式方面做得更好。 – 2010-09-25 05:14:41

1

不要使用正则表达式来解析这个使用拆分如

var arr; 
arr=str.split("\^","g"); 

,并执行你的每一个合适的描述逻辑项目在结果数组中。

道歉,如果我的Java语法不正确!

相关问题