Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用空格重新格式化列表字符串_Regex_Perl_Awk - Fatal编程技术网

Regex 用空格重新格式化列表字符串

Regex 用空格重新格式化列表字符串,regex,perl,awk,Regex,Perl,Awk,我有一个打印到控制台的字符串列表。我需要把它转换回带引号的字符串 假设示例文件如下所示 List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY) List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY) List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018

我有一个打印到控制台的字符串列表。我需要把它转换回带引号的字符串

假设示例文件如下所示

List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD,    UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
"     UT_LVL_17_CD"
"UT_LVL_20_CD   ",
对于上述所有3种组合,输出应为

List("UT_LVL_17_CD", "UT_LVL_20_CD", "2018 1Q", "2018 2Q", "2018 3Q", "2018 4Q", "2018 FY")
请注意,起点、终点或图元之间的间距是可以接受的

List(  "UT_LVL_17_CD", "UT_LVL_20_CD", "2018 1Q", "2018 2Q", "2018 3Q", "2018 4Q",    "2018 FY" )
但不在字符串值内,如下所示

List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD,    UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
"     UT_LVL_17_CD"
"UT_LVL_20_CD   ",
应保留每个元素中已有的空格
“2018 4Q”

我正在尝试下面的方法,但无法得到正确的结果

$ perl -pe ' s/(?<=\()|(?=,)|(?=\))/\"/sg ' list.txt
List("UT_LVL_17_CD", UT_LVL_20_CD", 2018 1Q", 2018 2Q", 2018 3Q", 2018 4Q", 2018 FY")
List("UT_LVL_17_CD",UT_LVL_20_CD",2018 1Q",2018 2Q",018 3Q",2018 4Q",2018 FY")
List(" UT_LVL_17_CD",    UT_LVL_20_CD",2018 1Q",2018 2Q", 2018 3Q", 2018 4Q", 2018 FY ")
$
$perl-pe的/(?试试这个

(?<=\(|,)\s*(.*?)\s*(?=\)|,)

(?查看以下各项是否适用于您:

[(,]\K\s*(.*?)\s*(?=[),])
在线查看


  • [(,]
    -匹配逗号或开头
  • \K
    -重置报告匹配的起点
  • \s*
    -匹配零个或多个空格
  • (.*)
    -第一个捕获组,用于捕获具有惰性量词的任何字符
  • \s*
    -匹配零个或多个空格
  • (?=[),])
    -正向前瞻以匹配逗号或结束语

根据链接的演示,替换为
“\1”

另一个选项可以是使用
\G
锚定并匹配单词字符,可以选择按空格和单词字符重复

(?:\G(?!^),|\bList\((?=[^()\r\n]*\)))\K\h*(\w+(?:\h+\w+)*)\h*
解释

  • (?:
    非捕获组
    • \G(?!^),
      在上一次匹配结束时断言位置,但不要在开始时断言位置(因为
      \G
      可以在这两个位置匹配)
    • |
    • \bList\((?=[^()\r\n]*\)
      单词边界,然后匹配
      列表(
      并在同一行上断言结束
  • 关闭非捕获组
  • \K\h*
    忘记目前匹配的内容(不删除匹配的
    列表(
    和逗号),并匹配要删除的可选空格
  • Capturegroup 1
    • \w+(?:\h+\w+*
      匹配1+个单词字符,可以选择按空格和单词字符重复
  • )\h*
    关闭组1并匹配要删除的可选尾随空格

在替换中,在双引号之间使用组1

$perl-pne的/\(\s+/\(/;/([^(]+\()(.+)\)/;$\=“$1\”.连接(“\”,\”,拆分(/,\s*/,$2))。”\n“;”文件
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“2018年第三季度”、“2018年第四季度”、“2018财年”)
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“018年第三季度”、“2018年第四季度”、“2018财年”)
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“2018年第三季度”、“2018年第四季度”、“2018财年”)
输入测试文件:

$ cat file
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,    UT_LVL_20_CD,2018 1Q,2018 2Q,018     3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD,    UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )

OP提到前导/尾随空格是可以接受的…我认为这意味着去掉不必要的前导/尾随空格也是可以接受的

样本输入:

$ cat string.dat
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD,    UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
一个不那么紧凑的
awk
idea:

awk -F'[()]' '                         # input field delimiters are "(" and ")"
{ printf "%s(", $1                     # print field #1 + "("
  n=split($2,a,",")                    # split field #2 by ",", save in array a[]
  pfx=""                               # initial prefix is ""
  for (i=1 ; i<=n ; i++)               # loop through a[] elements
      { gsub(/^ *| *$/,"",a[i])        # strip leading/trailing spaces
        printf "%s\"%s\"", pfx, a[i]   # print prefix + current a[] element wrapped in double quotes
        pfx=","                        # set prefix to "," for rest of a[] elements
      }
   printf ")\n"                        # print final ")"
}
' string.dat

同样的想法:@JvdV..是的,它很有效..你能把它添加为answer@JvdV..这只是一个临时工作。性能不是一个问题。最后一个值显示为
“2018财年”
它应该是
“2018财年”
@stack0114106已修复。除了简单地剥离
映射中的前导/尾随空格之外,看不到任何更好的东西,稍后将再次查看…np.祝您愉快编辑:必须剥离
映射中的尾随空格
--但随后可以将所有内容清除,因此删除了其他
\s
是的..很有效..但发现很难o了解您有没有其他简单的例子来理解regex@stack0114106例如,您可以看到或[我尝试了这个问题的\G样式..您能看一下吗?..great..idea..初始清理后在
/,\s*/
上拆分。。