【问题标题】:word extraction and splitting using Java regex使用 Java 正则表达式进行单词提取和拆分
【发布时间】:2015-07-29 20:52:57
【问题描述】:

我有一个字符串 "'GLO', FLO" 现在,我想要一个 regex 表达式来检查字符串中的每个单词,如果: -word 以单引号开头和结尾,用空格替换单引号 - 如果单词之间有逗号,则使用空格分隔两个单词。

所以,最后我应该得到GLO FLO

关于如何在字符串上使用replaceAll() 方法的任何帮助?

这个正则表达式不是为我做的:"'([^' ]+)|\\s+'"

public static void displaySplitString(final String str) {
   String pattern1 = "^'?(\\w+)'?,\\s+(\\w+)$";
   StringTokenizer strTok = new StringTokenizer(str, " , ");
   while (strTok.hasMoreTokens()) {
     String delim = (strTok.nextToken());
     delim.replaceAll(pattern1, "$1$2");
     System.out.println(delim);
   }
 } //in main method displaySplitString("'GLO', FLO");

【问题讨论】:

  • split 与替换不同
  • @shA.t 抱歉,它没有这样做。
  • this example code 怎么样?它对你有用吗?
  • 所以试试这个/.*?([^',]*\w)/g\1 ;)。
  • @stribizhev 我得到了这个:'GLO' FLO 和你的代码。我应该得到这个:GLO FLO

标签: java regex


【解决方案1】:

这里是the snippet,应该可以帮助您:

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 参数声明更改为不是final(以便我们可以更改方法内的str 值)
  • 我正在使用第一个正则表达式 ^'?(\\w+)'?(?=\\S) 从第一个单词周围删除潜在的单引号
  • 由于您使用StringTokenizer,因此while 块内只需两行就足够了。

正则表达式的意思是:

  • ^ - 从字符串的最开始寻找匹配项
  • '? - 匹配 0 或 1 个单引号
  • (\\w+) - 匹配并捕获 1 个或多个字母数字符号(在替换模式中我们将它们称为 $1
  • '? - 匹配 0 或 1 个单引号
  • (?=\\S) - 仅当可选单引号后没有空格时才匹配。也许,如果您总是在第一个单词之后使用 ,,您甚至可以用一个简单的, 替换这个前瞻。

【讨论】:

  • 最后的说法不清楚。您在 (?=\\S) 语句中所说的“可选连字符”是什么?
  • 对不起,我的意思是引用。
  • 出于好奇,我今天研究了一点前瞻,但您的最后一句话似乎令人困惑和误导。正则表达式 (?=\\S) 检查选项后的下一个字符 '?是一个空间。所以,“..如果没有空格..”这句话是误导性的。这有意义吗?
  • \S 匹配非空格字符。 (?=\S) 表示检查下一个字符是否为非空格,但不要使用它。所以匹配不会有这个非空白字符。这里就像一个边界。
  • (?=(\\S|$) 用作\w+ 的边界。由于单引号是可选的,正则表达式引擎应该知道在哪里停止。我假设有逗号会停止 \w+ 模式,但我不知道输入那么好,因此,我假设必须有一个非空白字母或 string 的结尾(这里没有多行选项,所以$ 匹配字符串结尾)紧跟在单词字符和可选引号之后。不能使用字边界。也许,你根本不需要它。如果您总是只有逗号分隔的单词,请尝试仅使用 '?\\w+'?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多