Java正则表达式分别匹配每个组

Java正则表达式分别匹配每个组,java,regex,Java,Regex,我有这样一个字符串: String text = "new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265

我有这样一个字符串:

String text = "new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL')";
( [0] => new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), [1] => (422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), [2] => (422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), ) 和正则表达式:

String regex = "new SingleSizeProduct((.*))";
我想分别匹配所有6组,但当我匹配模式时,我得到如下结果:

String text = "new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL')";
( [0] => new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), [1] => (422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), [2] => (422056, 1265858, 5430, '3XL', 75, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL'), ) ( [0]=>新单体尺寸产品(42205612658585430,'3XL',75,0,'14.90','16.50','29.90','TL'),新单体尺寸产品(422056112658595341,'L',55,0,'14.90','16.50','29.90','TL),新单体尺寸产品(42205612658605459,'M',45,1,'14.90','16.50','29.90','TL新单体尺寸产品(42205615446,'S',35,0,'14.90','16.50','29.90','TL'),新单件产品(422056112658625458,'XL',60,0,'14.90','16.50','29.90','TL'),新单件产品(42205612658635511,'XXL',65,0,'14.90','16.50','29.90','TL等等), [1] =>(42205612658585430,'3XL',75,0,'14.90','16.50','29.90','TL'),新单体产品(422056112658595341,'L',55,0,'14.90','16.50','29.90','TL'),新单体产品(422056112658605459,'M',45,1,'14.90','16.50','29.90','TL),新单体产品(422056112658615446,'S',35,0,'14.90','16.50','29.90','TL),新单体尺寸产品(42205612658625458,'XL',60,0,'14.90','16.50','29.90','TL'),新单体尺寸产品(422056112658635511,'XXL',65,0,'14.90','16.50','29.90','TL'), [2] =>(42205612658585430,'3XL',75,0,'14.90','16.50','29.90','TL'),新单体产品(422056112658595341,'L',55,0,'14.90','16.50','29.90','TL'),新单体产品(422056112658605459,'M',45,1,'14.90','16.50','29.90','TL),新单体产品(422056112658615446,'S',35,0,'14.90','16.50','29.90','TL),新单体尺寸产品(42205612658625458,'XL',60,0,'14.90','16.50','29.90','TL'),新单体尺寸产品(422056112658635511,'XXL',65,0,'14.90','16.50','29.90','TL'), )
如何分别匹配每个组?

避开文字上的反斜杠,并使用不情愿的:


()

*
是贪婪的,因此它将尝试找到最大可能的匹配,这意味着
(.*)
将匹配

abc(foo)def(bar)ghi
    ^^^^^^^^^^^
如果你想让它找到最小可能的匹配

abc(foo)def(bar)ghi
    ^^^     ^^^
通过在后面添加
使
*
不情愿

String regex = "new SingleSizeProduct((.*?))";
您还需要转义
,因为您知道它们代表捕获组的开始和结束

String regex = "new SingleSizeProduct\\((.*?)\\)";
顺便说一句,另一个解决方案是使用而不是
*?
[^)]*
,这意味着除了
之外的所有内容都可以使用


假设输入保持不变,您可以在此处使用
split

String text    = "new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90',     '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'),new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL')";
String[] parts = text.split("(?<=\\)),");
System.out.println(Arrays.toString(parts));

taxn,它解决了我的问题,String regex=“new SingleSizeProduct\(*?)”;tanx for quick response too+1假设输入只包含
new SingleSizeProduct(…)
值。如果其他值是可能的,比如
,那么新的Foo(…)
模式/匹配器将是更好的方法。
[
 new SingleSizeProduct(422056, 1265858, 5430, '3XL', 75, 0, '14.90',     '16.50', '29.90', 'TL'), 
 new SingleSizeProduct(422056, 1265859, 5341, 'L', 55, 0, '14.90',     '16.50', '29.90', 'TL'), 
 new SingleSizeProduct(422056, 1265860, 5459, 'M', 45, 1, '14.90', '16.50', '29.90', 'TL'), 
 new SingleSizeProduct(422056, 1265861, 5446, 'S', 35, 0, '14.90', '16.50', '29.90', 'TL'), 
 new SingleSizeProduct(422056, 1265862, 5458, 'XL', 60, 0, '14.90', '16.50', '29.90', 'TL'), 
 new SingleSizeProduct(422056, 1265863, 5511, 'XXL', 65, 0, '14.90', '16.50', '29.90', 'TL')
]