2012-11-13 88 views
3

我不得不将这个preg_split代码“翻译”成Java等价物。我尝试了一些没有成功的事情。这里是PHP代码,我试图翻译:与此preg_split等效的Java是什么?

$str="1 [3 4 5] 6 7 [8 9] 4"; 
$chars = preg_split("^\[(.*?)\]||/ /^", $str, -1, PREG_SPLIT_DELIM_CAPTURE); 

foreach ($chars as $key => $value) { 
    if(ord($value)!=0 && $value!=" "){ 
     $res[]=$value; 
    } 
} 
print_r($res); 

正如你看到的,我的字符串输入,可以由数字字符的任意序列,其中一些被包裹括号[]:

1 [3 4 5] 6 7 [8 9] 4 

括号可以在字符串的开头或结尾,对此没有限制。

按照上面的例子中,结果是这样的:

[0] = "1" 
[1] => "3 4 5" 
[2] => "6" 
[3] => "7" 
[4] => "8 9" 
[5] => "4" 

我发现了一些问题,试图转换正则表达式(看起来像“\”失败为无效转义序列)。

+3

要在正则表达式机制中放置“\”,您需要在String中将其写为“\\”,以便在String中转义其特殊含义。 – Pshemo

+0

我不认为你的preg_split做你说的那样。尝试输入字符串“234 [3 4 5] 6/4// 7/7 [8 9] 4”。第一个数字以单个数字的形式返回。其中两个消失。看我的测试:http://codepad.org/C69hPk19 –

+0

嗨西蒙,但我只接收数字和括号,我从来没有得到/ – afontcu

回答

3

与其将问题想象为“分裂”,我会试着想出一个正则表达式,它匹配您正在查找的表单的任何单个子字符串,然后收集该表达式的所有匹配项,例如:

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|\\d+"); 
Matcher m = p.matcher(inputStr); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) matches.add(m.group()); 

|左边的位匹配方括号内的任何内容,右边的位与任何其他数字序列匹配。

请注意,如果要在Java字符串文字中编写正则表达式,则需要将反斜杠加倍 - 文字"\\"表示包含一个反斜杠的单个字符字符串。

+0

哇,这很聪明。我实际上想出了这些东西,但是我没有像你说的那样看待这个问题。非常感谢你! – afontcu

相关问题