java - 正则表达式,用于在未被单引号或双引号括起时使用空格分割字符串

我是正规表达的新手,非常感谢你的帮助。 我正在尝试将一个表达式组合在一起,该表达式将使用未被单引号或双引号括起的所有空格分割示例字符串。 我的最后一次尝试看起来像这样:"will be"并且工作不太好。 在报价之前,它正在拆分空间。

输入示例:

This is a string that "will be" highlighted when your 'regular expression' matches something.

期望的输出:

This

is

a

string

that

will be

highlighted

when

your

regular expression

matches

something.

请注意,"will be"和'regular expression'保留了单词之间的空格。

carlsz asked 2019-07-25T08:34:25Z

13个解决方案

220 votes

我不明白为什么所有其他人都在提出如此复杂的正则表达式或如此长的代码。 从本质上讲,您希望从字符串中获取两种内容:不是空格或引号的字符序列,以及以引号开头和结尾的字符序列,两种引号之间没有引号。 您可以使用此正则表达式轻松匹配这些内容:

[^\s"']+|"([^"]*)"|'([^']*)'

我添加了捕获组,因为您不希望列表中的引号。

此Java代码构建列表,添加捕获组(如果匹配以排除引号),并在捕获组不匹配时添加整体正则表达式匹配(未匹配的单词匹配)。

List matchList = new ArrayList();

Pattern regex = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");

Matcher regexMatcher = regex.matcher(subjectString);

while (regexMatcher.find()) {

if (regexMatcher.group(1) != null) {

// Add double-quoted string without the quotes

matchList.add(regexMatcher.group(1));

} else if (regexMatcher.group(2) != null) {

// Add single-quoted string without the quotes

matchList.add(regexMatcher.group(2));

} else {

// Add unquoted word

matchList.add(regexMatcher.group());

}

}

如果您不介意在返回的列表中使用引号,则可以使用更简单的代码:

List matchList = new ArrayList();

Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");

Matcher regexMatcher = regex.matcher(subjectString);

while (regexMatcher.find()) {

matchList.add(regexMatcher.group());

}

Jan Goyvaerts answered 2019-07-25T08:35:00Z

12 votes

StackOverflow上有几个问题在使用正则表达式的各种上下文中涵盖了同一个问题。 例如:

解析字符串:提取单词和短语

解析空格分隔文本的最佳方法

更新:示例正则表达式处理单引号和双引号字符串。 参考:我怎样才能拆分字符串,除非在引号内?

m/('.*?'|".*?"|\S+)/g

使用快速Perl片段对此进行测试,输出如下所示。 如果它们在引号之间(不确定是否需要),也适用于空字符串或仅空白字符串。

This

is

a

string

that

"will be"

highlighted

when

your

'regular expression'

matches

something.

请注意,这确实包括匹配值中的引号字符本身,但您可以使用字符串替换删除它,或修改正则表达式不包括它们。 我现在将其留作读者或另一张海报的练习,因为凌晨2点已经太晚了,不能再乱用正则表达式;)

Jay answered 2019-07-25T08:36:06Z

5 votes

如果要在字符串中允许转义引号,可以使用以下内容:

(?:(['"])(.*?)(?\\\\)*\1|([^\s]+))

引用的字符串将是第2组,单个未引用的字符将是第3组。

你可以在这里尝试各种字符串:[http://www.fileformat.info/tool/regex.htm]或[http://gskinner.com/RegExr/]

mcrumley answered 2019-07-25T08:36:46Z

3 votes

来自Jan Goyvaerts的正则表达式是我迄今为止找到的最佳解决方案,但也创建了空(空)匹配,他在程序中排除了这些匹配。 这些空匹配也来自正则表达式测试人员(例如rubular.com)。如果您转动搜索周围(首先查找引用的部分而不是空格的单词),那么您可以使用以下命令执行以下操作:

("[^"]*"|'[^']*'|[\S]+)+

iRon answered 2019-07-25T08:37:11Z

2 votes

(?

这将匹配未被双引号括起的空格。我必须使用min,max {0,99999},因为Java不支持*和+在lookbehind中。

Marcus Andromeda answered 2019-07-25T08:37:36Z

1 votes

搜索字符串,抓取每个部分,而不是拆分它可能会更容易。

原因是,您可以将它拆分为"will be"之前和之后的空格。但是,我想不出任何方式来指定忽略拆分内部之间的空间。

(不是实际的Java)

string = "This is a string that \"will be\" highlighted when your 'regular expression' matches something.";

regex = "\"(\\\"|(?!\\\").)+\"|[^ ]+"; // search for a quoted or non-spaced group

final = new Array();

while (string.length > 0) {

string = string.trim();

if (Regex(regex).test(string)) {

final.push(Regex(regex).match(string)[0]);

string = string.replace(regex, ""); // progress to next "word"

}

}

此外,捕获单引号可能会导致问题:

"Foo's Bar 'n Grill"

//=>

"Foo"

"s Bar "

"n"

"Grill"

Jonathan Lonowski answered 2019-07-25T08:38:23Z

1 votes

String.split()在这里没有帮助,因为没有办法区分引号内的空格(不拆分)和外部(拆分)的空格。 Matcher.lookingAt()可能是你所需要的:

String str = "This is a string that \"will be\" highlighted when your 'regular expression' matches something.";

str = str + " "; // add trailing space

int len = str.length();

Matcher m = Pattern.compile("((\"[^\"]+?\")|('[^']+?')|([^\\s]+?))\\s++").matcher(str);

for (int i = 0; i < len; i++)

{

m.region(i, len);

if (m.lookingAt())

{

String s = m.group(1);

if ((s.startsWith("\"") && s.endsWith("\"")) ||

(s.startsWith("'") && s.endsWith("'")))

{

s = s.substring(1, s.length() - 1);

}

System.out.println(i + ": \"" + s + "\"");

i += (m.group(0).length() - 1);

}

}

产生以下输出:

0: "This"

5: "is"

8: "a"

10: "string"

17: "that"

22: "will be"

32: "highlighted"

44: "when"

49: "your"

54: "regular expression"

75: "matches"

83: "something."

Zach Scrivena answered 2019-07-25T08:38:55Z

1 votes

我喜欢Marcus的方法,但是,我修改它以便我可以在引号附近允许文本,并支持“和”引用字符。例如,我需要一个=“某个值”不将它分成[a =,“ 一些价值“]。

(?

Eric Woodruff answered 2019-07-25T08:39:24Z

1 votes

Jan的方法很棒,但这是另一个记录。

如果你真的想像标题中提到的那样拆分,保持报价在'quoted strings'和"double-quoted strings",那么你可以使用这种方法直接匹配(或替换)一个模式,除了情况s1,s2,s3等

正则表达式:

'[^']*'|\"[^\"]*\"|( )

两个左侧交替匹配完成'quoted strings'和"double-quoted strings".我们将忽略这些匹配。 右侧匹配并捕获第1组的空格,我们知道它们是正确的空格,因为它们与左侧的表达式不匹配。 我们用SplitHere替换那些,然后拆分SplitHere。再次,这是一个真正的拆分案例,你想要"will be",而不是will be。

这是一个完整的工作实现(参见在线演示的结果)。

import java.util.*;

import java.io.*;

import java.util.regex.*;

import java.util.List;

class Program {

public static void main (String[] args) throws java.lang.Exception {

String subject = "This is a string that \"will be\" highlighted when your 'regular expression' matches something.";

Pattern regex = Pattern.compile("\'[^']*'|\"[^\"]*\"|( )");

Matcher m = regex.matcher(subject);

StringBuffer b= new StringBuffer();

while (m.find()) {

if(m.group(1) != null) m.appendReplacement(b, "SplitHere");

else m.appendReplacement(b, m.group(0));

}

m.appendTail(b);

String replaced = b.toString();

String[] splits = replaced.split("SplitHere");

for (String split : splits) System.out.println(split);

} // end main

} // end Program

zx81 answered 2019-07-25T08:40:22Z

1 votes

如果您使用的是c#,则可以使用

string input= "This is a string that \"will be\" highlighted when your 'regular expression' matches ";

List list1 =

Regex.Matches(input, @"(?\w+)|\""(?[\w\s]*)""|'(?[\w\s]*)'|[\w\s]*)>").Cast().Select(m => m.Groups["match"].Value).ToList();

foreach(var v in list1)

Console.WriteLine(v);

我特意添加了“|&lt;(?[\ w \ s] *)&gt;” 突出显示您可以指定任何字符串组。 (在这种情况下,我使用&lt;&gt;进行分组。

输出是:

This

is

a

string

that

will be

highlighted

when

your

regular expression

matches

something random

Praveen Singh answered 2019-07-25T08:40:59Z

0 votes

我有理由相信单独使用正则表达式是不可能的。 检查某些其他标记内是否包含某些内容是解析操作。 这似乎与尝试使用正则表达式解析XML一样 - 它无法正确完成。 您可以通过重复应用与引用的字符串匹配的非贪婪,非全局正则表达式来获得所需的结果,然后一旦找不到任何其他内容,将其拆分为空格... 问题,包括跟踪所有子串的原始顺序。 你最好的选择就是编写一个非常简单的函数来迭代字符串并拉出你想要的标记。

rmeador answered 2019-07-25T08:41:27Z

0 votes

一对夫妇希望对Jan的接受答复进行有用的调整:

(['"])((?:\\\1|.)+?)\1|([^\s"']+)

允许在带引号的字符串中使用转义引号

避免重复单引号和双引号的模式; 如果需要,这也简化了添加更多引用符号(以另外一个捕获组为代价)

pascals answered 2019-07-25T08:42:08Z

0 votes

你也可以试试这个:

String str = "This is a string that \"will be\" highlighted when your 'regular expression' matches something";

String ss[] = str.split("\"|\'");

for (int i = 0; i < ss.length; i++) {

if ((i % 2) == 0) {//even

String[] part1 = ss[i].split(" ");

for (String pp1 : part1) {

System.out.println("" + pp1);

}

} else {//odd

System.out.println("" + ss[i]);

}

}

Rakesh Sosa answered 2019-07-25T08:42:29Z

java正则表达式匹配单引号_java - 正则表达式,用于在未被单引号或双引号括起时使用空格分割字符串...相关推荐

  1. java正则匹配的坑_java正则表达式入坑指南

    在日常开发工作中,无论你使用的语言是java.python.shell.golang还是C#, 正则表达式是编程语言中几乎绕不开的话题.有了它,可以帮你快速定位到符合条件的文本内容.今天小编带大家一起 ...

  2. java正则匹配英文句号_java正则表达式最简单 学习教程

    本大教程以一个验证手机号的表达式为例,学完本例后,基本上所有的表达式都能看懂了,但是如果想要达到上手就能写的程度,还需要多练习多测试 呀! 来看 这样一个代码 String mobilePhoneRe ...

  3. java正则匹配下划线_java正则表达式-匹配中文数字字母下划线

    正则表达式用来指定字符串模式.当你需要定位匹配某种模式的字符串时就可以使用正则表达式.例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式来定位所有的超链接.     当然,为了指定一种 ...

  4. python正则匹配ip地址_IP地址正则表达式匹配方法,ip正则表达式匹配

    IP地址正则表达式匹配方法,ip正则表达式匹配 正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述 ...

  5. php正则表达式 匹配多行,PHP正则表达式怎么匹配多行

    PHP正则表达式怎么匹配多行 一.总结 1.可以用匹配模式修饰符s来使点匹配所有字符,包括换行符. 二.PHP匹配多行的正则表达式分析 代码如下: aaaa bbbb cccc dddd 像这种的文本 ...

  6. js html 单引号,JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 ' ' x 1 ...

  7. java正则匹配英文句号_Scala 正则表达式 0411

    Scala 正则表达式 Scala 通过 scala.util.matching 包中的 Regex 类来支持正则表达式.以下实例演示了使用正则表达式查找单词 Scala : import scala ...

  8. java 正则提取大于等于号_Java正则表达式

    一.简述 在字符串比较时,简单的操作可以使用一些算法来查找或匹配,如要判断一个端口地址地址是否合法,可以简单的判断其是否在0-65536之间. 但是,有一些字符匹配操作使用这种方法非常复杂,如匹配一个 ...

  9. java 正则匹配 sql星号,18. 正则表达式:开头、结尾、任意一个字符、星号和加号匹配...

    Re: MySQL 查询与高级查询(多表.嵌套和正则表达式) (查询的能力,亦显示DBA的功力) ============================================= 数据库管理 ...

  10. java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法

    java正则表达式过滤文件的实现方法 正则表达式过滤文件列表,听起来简单,如果用java实现,还真需要一番周折,本文简析2种方式 1.适用于路径确定,文件名时正则表达式的情况(jdk6的写法) Str ...

最新文章

  1. 得出来的视差图左边有黑色补上原图_「PS教程」Photoshop使用通道快速抠图的详细教程...
  2. python 技术篇-logging模块的日志定期清理设置,自动清理上个月的日志实例演示
  3. yii框架源码分析之创建controller
  4. postman安装路径_Newman进行postman脚本自动化
  5. python 下载文件-用python下载文件的若干种方法汇总
  6. iOS手势的传递问题
  7. 怎么解决Myeclipse导入项目中文乱码?
  8. 【Python 多进制转换】——数值多进制转换bin、oct、int、hex(2进制、4进制、8进制、10进制、16进制、32进制)
  9. c/c++ 头文件(.h)、源文件(.cpp)书写及接口与实现分离实例
  10. latex大括号 多行公式_使用数组公式一步搞定公式批量计算,让效率提高数十倍...
  11. 迅雷【任务出错】临时解决方案
  12. 机器学习常用数学符号及读法大全
  13. 汇编语言0x2c,ARM汇编语言(4) 指令、伪操作、伪指令学习
  14. 小白篇之RTMP编码器辅助OBS实现多个平台推流直播
  15. ps快速去掉图中的字
  16. 飞猪大数据:85后带来春节旅行新气氛
  17. config语言和config.in文件
  18. 区块链和大数据一起能否开启数据完整性的新纪元?
  19. 2021年度关键词-ICT网络基础设施建设
  20. 盗取QQ密码的Trojan.PSW.QQPass.rky正通过QQ信息中的网址传播

热门文章

  1. 荣耀4a刷android 6,华为荣耀4a刷机教程_华为荣耀4a强刷官方系统包
  2. 京东VC后台自动批量上传主图 大聪明自动传主图 c# selenium网页自动化传图
  3. python企业微信回调_Python微信企业号开发之回调模式接收微信端客户端发送消息及被...
  4. Python中requirement 的使用
  5. 2020年计算机夏令营总结
  6. 1991年首批全国500位名老中医
  7. java之STS使用和相关目录解说、springBoot微服务项目、前后端发送和接收参数的方式、文件图片视频上传
  8. python可视化世界地图_菜鸟笔记Python3——数据可视化(二)世界地图
  9. MenuetOS-令人不可思议的64位操作系统!
  10. RFID固定资产盘点的解决方案