我一直试图做这个正则表达式一段时间了。我想创建一个匹配文本所有空格的文本,但文字字符串除外。
例:
123 Foo“带空格的字符串”
123和Foo之间的空格匹配,以及Foo和“带空格的字符串”之间的空格,但只有那两个。
由于
答案 0 :(得分:1)
一个常见的,简单的策略是计算在字符串中前往您所在位置的引号数。如果计数是奇数,则你在一个带引号的字符串内;如果金额是偶数,则您在引用的字符串之外。我无法想到在正则表达式中执行此操作的方法,但您可以使用此策略来过滤结果。
答案 1 :(得分:1)
您可以使用re.findall
匹配字符串或空格,然后检查匹配项:
import re
hits = re.findall("\"(?:\\\\.|[^\\\"])*\"|[ ]", 'foo bar baz "another\\" test\" and done')
for h in hits:
print "found: [%s]" % h
的产率:
found: [ ]
found: [ ]
found: [ ]
found: ["another\" test"]
found: [ ]
found: [ ]
一个简短的解释:
" # match a double quote
(?: # start non-capture group 1
\\\\. # match a backslash followed by any character (except line breaks)
| # OR
[^\\\"] # match any character except a '\' and '"'
)* # end non-capture group 1 and repeat it zero or more times
" # match a double quote
| # OR
[ ] # match a single space
答案 2 :(得分:0)
如果这个 - >> 123 Foo“带有空格的字符串”< - 是您的结构,用于表示文字后跟引用文本的行,您可以创建2组引用文本和不带引号的文本,并分别处理它们
ex.regex - > {1}}其中$ 1应包含 - > 123 Foo< - 和$ 2 - >“带空格的字符串”< -
java示例。
(.*)(".*")
javascript示例。
String aux = "123 Foo \"String with spaces\"";
String regex = "(.*)(\".*\")";
String unquoted = aux.replaceAll(regex, "$1").replace(" ", "");
String quoted = aux.replaceAll(regex, "$2");
System.out.println(unquoted+quoted);