使用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); 
        }
    }
这里,

  • 我将
    str
    参数声明更改为not
    final
    (这样我们就可以更改方法中的
    str
    值)
  • 我正在使用第一个正则表达式
    ^'?(\\w+)?(?=\\S)
    删除第一个单词周围可能的单引号
  • 由于您使用的是
    StringTokenizer
    ,因此
    while
    块中只有两行就足够了
regex是指:

  • ^
    -从字符串的最开头开始查找匹配项
  • -匹配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); 
        }
    }