Pure RegEx删除空格

时间:2017-03-03 02:05:14

标签: regex

我有一个仅通过XML配置的文档处理应用程序。我可以指定搜索正则表达式来查找图像上的某些内容并在找到时将其返回。例如,要查找6位数的发票号,我要求[\ d] {6}并返回该号码。真的很直接。但是,我有一个特定的发票编号,其中6位数字间隔开('1 2 3 4 5 6')。

[\d\s]{6,12}用空格拾取字符串。如果我不寻找空格,它不匹配,所以它不返回任何东西。 Freespacing也不会返回任何内容。

我已阅读并尝试了其他一些回复herehere,但这些建议无效。我也无法写任何替换,因为我无法访问代码。

在同一个正则表达式中搜索和替换是不是一种简单的方法? (我知道......这是搜索,所以根据定义,它与找到的内容相匹配......只是用完了想法)

1 个答案:

答案 0 :(得分:1)

  

引用: [\d\s]{6,12}用空格拾取字符串。如果我不寻找空格,它就不匹配,所以它不会返回任何东西。 Freespacing也不会返回任何内容。

要小心,这是为了做什么,只是在这里工作的巧合。您还可以获得未来的匹配,例如12个空格,12个数字,4个数字和2个空格,3个数字和6个空格。 {6是量词范围的下限,12}是上限。 \s还包含任何空格字符,因此各种newines,换页符和制表符可以是您的字符串。

Freespacing完全不同,只会使你的正则表达式中的空格字符无关,这样你就可以用更易读的格式编写。

在不知道更多情况下,找到匹配的最佳正则表达式可能就是这样,因为阅读起来非常清楚。您需要freespacing关闭此功能。

  • (?:(\d) (\d) (\d) (\d) (\d) (\d)),例如this引用群组$1$2$3$4$5$6
    • 只需搜索,即可\d \d \d \d \d \d
  • 或使用自由空间(?:(\d)[ ](\d)[ ](\d)[ ](\d)[ ](\d)[ ](\d))

(\d\s){6}也会匹配您的模式 - 如果有一个尾随空格,其中\s取决于风味,几乎任何whitespace个字符(用于分组的括号,而不是字符类的方括号),但不适合替换操作。

即使没有空格,注释中提到的偶数(\d\s?){6}也有允许6位数字符串(例如235211)的缺陷。这是因为此实例中的?表示0 or 1 times, as many times as possible。如果它在那里就抓住它,如果没有它就忽略它。鉴于源代码的设计,此正则表达式可以作为一个简单的查找解决方案(?:\d\s(?:\s|$)),其中(?:\s|$)表示whitespace character, or if that's not present end of string/line取决于标记。