【问题标题】:java regular expression: conditionally spilt string by capital lettersjava正则表达式:按大写字母条件拆分字符串
【发布时间】:2016-04-13 16:05:13
【问题描述】:

我不熟悉正则表达式。也许这是一个简单的问题。 给定一个字符串

XYZHelloWorldT

我需要返回一个字符串数组

{XYZ Hello World T}

即取所有恰好以一个大写字母开头后跟一个或多个小写字母多个大写字母的词, 后跟 一个大写字母 开始一个新单词。其余部分由空位分隔为字符串数组中的其他元素。

我可以直接处理角色。只是想知道我是否可以直接在字符串的 split 方法中通过正则表达式来做到这一点?我发现了类似Java: Split string when an uppercase letter is found 的东西,但不知道如何使用它来解决我的问题。谢谢

【问题讨论】:

  • 你一直有这种格式的字符串吗?
  • 它可以是“HelloWorld”或“XYZHelloWorld”。我不确定如何将 XYZ 与 Hello 分开?谢谢

标签: java regex string


【解决方案1】:

由于您可以有多个连续的大写字母,因此您希望对小写进行后视以及对大写进行前瞻:

(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])

如果你想支持其他语言,你应该使用posix character classes:

(?<=\\p{Lower})(?=\\p{Upper})|(?<=\\p{Upper})(?=\\p{Upper}\\p{Lower})

如果您在小写和大写字母之间,第一个替换将匹配。第二个 - 如果你在一个大写和另一个大写之间,然后是小写。

【讨论】:

  • 返回 [XYZHello, World, T]。如何从 Hello 中拆分 XYZ
【解决方案2】:

这是Java中的算法,用于查找这个词,但不推荐用于大文本,也不包括数字和空格。

public class TestString
{
	static int	i	= 0, lenght;
	static char array[];
	
	public static void main(String[] args){
		String result = "XYZHelloWorldTRTTTePoPoIiiiiiooY";
		array = result.toCharArray();
		lenght=array.length;

		StringBuffer words = new StringBuffer();
		for(; i< lenght; i++){
			words.append(makeArray());
		}
		String resultOut[]= words.toString().split(",");
		for(String key: resultOut){
			System.out.println(key);
		}
		System.exit(0);
	}

	private static String makeArray()
	{
		StringBuffer word = new StringBuffer();
		String upper, normal;
		boolean lower=false;
		for(; i< lenght; ++i){
			word.append(array[i]);
			if(i<lenght-2){
				upper=String.valueOf(array[i+1]).toUpperCase();
				normal=String.valueOf(array[i+1]);
				if(upper.equals(normal)){
					upper=String.valueOf(array[i+2]).toUpperCase();
					normal=String.valueOf(array[i+2]);
					if(upper.equals(normal)){
						if(lower){
							break;
						}
						continue;
						
					}else{
						break;
					}
				}else{
					lower=true;
					continue;
				}
			}else{
				if(lower && i<lenght-1){
					String lowerStr=String.valueOf(array[i+1]).toLowerCase();
					normal=String.valueOf(array[i+1]);
					if(lowerStr.equals(normal)){
						continue;
					}else{
						break;
						
					}
				}
				break;
			}
		}
		word.append(",");
		return word.toString();
	}
}

你打算在我的算法中使用这个正则表达式吗?

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多