使用正则表达式删除前导/尾随空格,引号除外

时间:2018-05-06 15:24:16

标签: c++ regex c++11

我正在尝试编写一个正则表达式来识别用户输入字符串中的空格,但引号(" ... #load "my folder/my files/ program.prog" ; )之间除外。例如,如果用户输入

#load "my   folder/my  files/    program.prog" ;

我希望我的正则表达式替换将其转换为

#include <iostream> 
#include <string>
#include <regex>

int main(){
  // Variables for user input
  std::string input_line;
  std::string program;

  // User prompt
  std::cout << ">>> ";
  std::getline(std::cin, input_line);

  // Remove leading/trailing whitespaces
  input_line = std::regex_replace(input_line, std::regex("^ +| +$|( ) +"), "$1");

  // Check result
  std::cout << input_line << std::endl;

  return 0;
}

到目前为止,我已实施以下内容(您可以运行here)。

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

class LinkscrawlItem(scrapy.Item):
    # define the fields for your item here like:
    link = scrapy.Field()
    attr = scrapy.Field()

class someSpider(CrawlSpider):
  name = 'linkscrawl'
  item = []

  allowed_domains = ['mysite.com']
  start_urls = ['//www.mysite.com/']

  rules = (Rule (LinkExtractor(), callback="parse_obj", follow=True),
  )

  def parse_obj(self,response):
    #print(response.status)
    item = LinkscrawlItem()
    item["link"] = str(response.url)+":"+str(response.status)
    # item["link_res"] = response.status
    # status = response.url
    # item = response.url
    # print(item)
    filename = 'links.txt'
    with open(filename, 'a') as f:
      f.write('\n'+str(response.url)+":"+str(response.status)+'\n')
    self.log('Saved file %s' % filename)

但这也删除了引号之间的空格。有什么方法可以使用正则表达式来忽略引号之间的空格吗?

1 个答案:

答案 0 :(得分:1)

您可以添加另一个替代方法来匹配和捕获双引号字符串文字,并使用另一个反向引用将其重新插入到结果中:

input_line = std::regex_replace(
      input_line, 
      std::regex(R"(^ +| +$|(\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*\")|( ) +)"),
      "$1$2");

请参阅C++ demo

"[^"\\]*(?:\\[\s\S][^"\\]*)*\"部分与"匹配,然后匹配\"以外的0 +字符,然后出现0次或更多次转义字符{{1}然后是任何与\匹配的字符,然后是[\s\S]\以外的0 +字符。

注意我使用原始字符串文字"来避免必须转义正则表达式转义反斜杠(R"(...)" = R"([\s\S])")。