使用Java正则表达式进行单词提取和拆分
我有一个字符串使用Java正则表达式进行单词提取和拆分,java,regex,Java,Regex,我有一个字符串“'GLO',FLO”现在,我想要一个regex表达式来检查字符串中的每个单词,如果: -word以单引号开头和结尾,将单引号替换为空格 -如果单词之间遇到逗号,请使用空格拆分两个单词 所以,最后,我应该得到GLO-FLO 关于如何使用字符串上的replaceAll()方法执行此操作,是否有任何帮助 这个正则表达式不是为我做的:“'([^']+)\s+'” 这是你应该去的地方: public static void displaySplitString(String str)
“'GLO',FLO”
现在,我想要一个regex
表达式来检查字符串中的每个单词,如果:
-word以单引号开头和结尾,将单引号替换为空格
-如果单词之间遇到逗号,请使用空格拆分两个单词
所以,最后,我应该得到GLO-FLO
关于如何使用字符串上的replaceAll()
方法执行此操作,是否有任何帮助
这个正则表达式不是为我做的:“'([^']+)\s+'”
这是你应该去的地方:
public static void displaySplitString(String str)
{
String pattern1 = "^'?(\\w+)'?(?=\\S)";
str = str.replaceAll(pattern1, " $1 ");
StringTokenizer strTok = new StringTokenizer(str, " , ");
while (strTok.hasMoreTokens())
{
String delim = (strTok.nextToken());
System.out.println(delim);
}
}
这里,
- 我将
参数声明更改为notstr
(这样我们就可以更改方法中的final
值)str
- 我正在使用第一个正则表达式
删除第一个单词周围可能的单引号^'?(\\w+)?(?=\\S)
- 由于您使用的是
,因此StringTokenizer
块中只有两行就足够了while
-从字符串的最开头开始查找匹配项^
-匹配0或1个单引号?
)-匹配并捕获一个或多个字母数字符号(在替换模式中,我们将它们称为(\\w+
)$1
-匹配0或1个单引号?
-仅当可选单引号后没有空格时匹配。也许,你甚至可以用一个简单的(?=\\S)
来代替这个前瞻性,如果你总是在第一个单词后面有它的话,
拆分
与replacement@shA.t对不起,它没有这样做。那怎么办?它对您有用吗?所以请用\1
;)试试这个/.*([^',]*\w)/g
)@斯特里比切夫:我得到了这个:GLO'FLO和你的代码。我应该明白:格洛·弗洛最后一句话不清楚。在(?=\\S)语句中,你在说什么“可选连字符”?对不起,我指的是引用。出于好奇,我今天学习了一点前瞻性,但你最后的语句似乎令人困惑和误导。正则表达式(?=\\S)检查选项A'后的下一个字符?是一个空间。因此,“如果没有空格…”的说法是误导性的。这有意义吗?\S
匹配非空格字符(?=\S)
表示检查下一个字符是否为非空白字符,但不要使用它。因此,匹配项将不包含此非空白字符。它在这里就像一个边界。(?=(\\S |$)
用作\w+
的边界。由于单引号是可选的,正则表达式引擎应该知道在哪里停止。我假设有逗号将停止\w+
模式,但我对输入的了解不如您,因此,我假设必须有非空白字母或字符串结尾(此处没有多行选项,因此,$
匹配字符串结尾)紧跟在单词字符和可选引号之后。无法使用单词边界。可能您根本不需要它。如果始终只有逗号分隔的单词,请尝试使用“?\\w+”?
。
public static void displaySplitString(String str)
{
String pattern1 = "^'?(\\w+)'?(?=\\S)";
str = str.replaceAll(pattern1, " $1 ");
StringTokenizer strTok = new StringTokenizer(str, " , ");
while (strTok.hasMoreTokens())
{
String delim = (strTok.nextToken());
System.out.println(delim);
}
}