消除空白行上的空白


17

嗯,这是我对Stack的另一自私使用

作为Chromebook的所有者,我经常使用Cloud9使用的编辑器Ace IDE。它有很多用于处理多余空白的工具,但值得注意的是缺少一种:清除空白行。

今天的任务是,从一个地方输入,我可以将其复制粘贴到[ ;)],输出相同的东西,将所有空格和制表符保存在空白行上。

我将给出一些示例,其中#s表示要删除的空白字符。


输入1:

if (this.Color !== 'blue') {
##
  this.Color = 'blue';
}

输出:

if (this.Color !== 'blue') {
[empty line]
  this.Color = 'blue';
}

输入2:

function outputSomething(times) {
  for (var iter = 0; iter < times; iter++) {
    console.log('"# # " represents a tabulator');
    // This is a comment
# # 
}}

输出:

function outputSomething(times) {
  for (var iter = 0; iter < times; iter++) {
    console.log('"# # " represents a tabulator');
    // This is a comment
[empty line]
}}

输入3:

var x = 'Do you prefer spaces or tabs?';
var y = 'I\'m using both here. Sue me.';
# # ####
console.log(x + ' ' + y);

输出:

var x = 'Do you prefer spaces or tabs?';
var y = 'I\'m using both here. Sue me.';
[empty line]
console.log(x + ' ' + y);

您可以根据需要处理输入。只要我可以从中复制粘贴[ ;)] ,就可以将其输出到任何地方。

存在标准漏洞,最短答案以字节为单位!


我们是否必须在空白处保留空白行[empty line],或者根本不用空白行?
Leaky Nun

6
哦,而且,在任何人这样做之前,都没有进入过“太空与制表者”的神圣战争。这样做
会使

1
所有这些澄清是否必要?只需在没有其他字符的行上删除空格和制表符即可。
Papayaman1000

1
我们是否可以假定输入在任何行上都不会包含尾随空格(显然,全空格除外)?这些示例都没有。
ETHproductions'Apr 26'17

1
如果包含非空白的行尾有空白,是否可以剥离该空白?
Digital Trauma'Apr

Answers:


15

Japt 10 8 6 5 4字节

mx1R

在线尝试!

说明

(from the Japt docs)
.m(f,s=""):
Splits this with s, maps each item by f, then rejoins with s.

所以 mx1R将字符串拆分R为换行符,使用修剪每行的右侧,x1并再次使用换行符将字符串连接在一起。

由于ETHproductions,节省了2个字节。


1
恭喜你!你让视网膜发狂了!
Leaky Nun

非常好!您可以使用保存另一个字节®x1}R
ETHproductions'Apr 26'17

抓紧一点,您可以mx1R用4字节的ASCII :-)解决整个问题,x1即自动将解释m_x1}
ETHproductions

@ETHproductions哇,谢谢你的提示。无法看到为什么mx1R会起作用,但是它确实很酷!
汤姆(Tom),


23

视网膜,5字节

%G`\S

在线尝试!

一个不太明显的方法会给我们带来更好的分数:)

说明

G将其指示为Grep阶段,仅保留那些与给定正则表达式匹配的行(\S,匹配非空格字符)。如果不是开始%这将完全删除行,而不仅仅是“清空”行。

%是应用阶段一次,每行,然后加入与换行符的结果的修正:在我们的情况下,这意味着,通过grep命令只有空白线返回的空字符串将成为结果的空行。


即将发布,很好。:)
Martin Ender's

我想我还有很多关于视网膜的知识。
Leaky Nun

17

sed,6个字节

/\S/!g

在线尝试!

/  /!  # If the line doesn't contain...
 \S    # anything non-whitespace (i.e. the entire line is whitespace)
     g #   replace the pattern space with the hold space which is empty

2
我可能会使用substitution。使用普通匹配g是节省几个字节的聪明方法。
Digital Trauma'Apr

1
@DigitalTrauma那是我的第一个解决方案。这节省了1个字节。
莱利

1
太糟糕了sed,没有\S或“不是空格的东西”。还是呢?/\S/!g
aragaer

@aragaer有!真好!
莱利

9

V5,4个字节

ÇÓ/D

在线尝试!

说明:

Ç       " On every line not matching the following regex:
 Ó/     "   a non-whitespace character...
   D    "   Delete the whole line

十六进制转储:

00000000: c7d3 2f44                                ../D

您确定只有5个吗?V通常每个字符使用1个以上的字节。
Papayaman1000

1
@ papayamam1000 V每个字符不要使用多个字节。就在这里,它使用Latin1编码,其中所有那些非ASCII符号均为一个字节。我添加了一个
十六进制转储

很好,就是这样。
Papayaman1000

“非空白字符”这如何使具有多个空白字符的行免除删除?
亚当

9

JavaScript(ES6),26个字节

我不明白为什么这么多的赞!

s=>s.replace(/^\s+$/gm,``)

尝试一下

f=
s=>s.replace(/^\s+$/gm,``)
i.addEventListener("input",_=>o.innerText=f(i.value))
<textarea id=i></textarea><pre id=o>


7

Python 3中63个 55 36字节

lambda s:[x.strip()and x for x in s]

输入和输出是字符串数组。加入吧'\n'

对于具有I / O字符串的原始程序:

lambda s:'\n'.join(x.strip()and x for x in s.split('\n'))

在线尝试!

@Rod节省了8个字节!
@LeakyNun节省了19个字节!


@LeakyNun哦,嗯,忘记了我可以做到。谢谢!
HyperNeutrino

2
我认为您的原始代码更能应对挑战。它要求您能够将粘贴的文本复制到输入中,因此实际上您的代码应采用单个字符串(而不是数组)并将其拆分。
Notts90 '17

6

CJam18 16字节

qN/{_" 	"-\e&N}%

请注意,该字符串包含1个空格和1个制表符。

在线尝试!

说明

q                 e# Read the input
 N/               e# Split it on newlines
   {              e# Apply this block to each line:
    _             e#  Copy the line
     "  "-        e#  Remove all spaces and tabs from the copy
          \       e#  Bring the original to the top of the stack
           e&     e#  Logical AND; returns the original line if the copy is truthy 
                  e#    (non-empty), otherwise returns the copy line
             N    e#  Push a newline after the line
              }%  e# (end of block)

5

视网膜,8字节

m`^\s+$

一个真正毫无意义的挑战。m使它成为多行(忽略换行符)。\s匹配空格和制表符。

在线尝试!


视网膜始终是第一位的。即使其发布者要求在评论中提供[可能是必要的]澄清。
Papayaman1000

@ Papayaman1000人们一直在这样做。如果规则与预期不符,他们便可以更改答案。
HyperNeutrino

6
Tha挑战可能不是很有趣,但是称它为毫无意义的似乎

5
这是您的用语,只有知道您的用语。是否进行编辑以及使用哪种新措辞完全
Luis

3
@HyperNeutrino正确的操作方法是关闭尚不清楚的挑战,并在添加了这些说明后重新打开。
Martin Ender

5

Vim,20 18 16 13 10字节

我绝不是Vim专家,但是这个问题需要Vim回答。

:%s/^\s*$<cr>

<cr> 是回车。

变更日志:

  • :norm而不是:normal(-2个字节)
  • 切换到*而不是+意味着我们将匹配已经为空的行,但这并不重要。现在我们可以摆脱\v非常神奇的选择)(-2个字节)
  • 新方法:不是将所有匹配的行替换为空行,而是将所有没有非空白字符的行替换为空行。(-3个字节)
  • 实际上,正常替换时间较短(感谢@DJMcMayhem)(-3个字节)

1
作为替代命令,它更短::%s/^\s*$<cr>
DJMcMayhem

5

AWK12 11字节

!NF{$0=""}1

在线尝试!

我只是觉得AWK也应该有答案

它的工作原理是:

  1. 检查输入中是否没有字段。默认情况下,AWK使用所有空格作为字段之间的分隔符
  2. 如果没有字段,请将输入行更改为空字符串
  3. 打印行。由于1是真实值,因此它将运行默认命令,该命令将打印行

删除了一个字节,因为大括号后不需要分号
jmriego

你给了我一个想法... ^^我恢复这一点,并用2个字节结束了:“NF”
奥利维尔·杜拉克

哦...我以为我们必须摆脱空行... :(
Olivier Dulac

1
由于相同的原因,我所做的与第一次尝试完全相同。我知道这种感觉:)
jmriego

好消息是:现在我知道如何使用一个很小的awk oneliner ^^来摆脱我自己程序(或显示文件时)中的那些内容。顺便说一句,您的回答是好又紧。做得好。
奥利维尔·杜拉克

5

APL(Dyalog)11 10字节

'\s+$'R''

⎕R是一个运算符,该运算符派生出替换东西的功能。在这种情况下,与RegEx匹配的所有内容都将替换为空字符串。


4

Ruby,22个字节

->s{s.gsub /^\s+$/,''}

简单的正则表达式解决方案


3

Java 7,57字节

String c(String s){return s.replaceAll("(?m)^\\s+$","");}

说明:

String c(String s){     // Method with String parameter and String return-type
  return s.replaceAll(  //  Return the input String after we've replaced
    "(?m)^\\s+$",       //  all lines only containing whitespaces
    "");                //  with empty Strings
                        //    (NOTE: `(?m)` enables multiline regex)
}                       // End of method

测试代码:

在这里尝试。

class M{
  static String c(String s){return s.replaceAll("(?m)^\\s+$","");}

  public static void main(String[]a){
    System.out.println(c("if (this.Color !== 'blue') {\n \t\n  this.Color = 'blue';\n}"));
    System.out.println();
    System.out.println(c("function outputSomething(times) {\n  for (var iter = 0; iter < times; iter++) {\n    console.log('\"# # \" represents a tabulator');\n    // This is a comment\n  \t\n}}"));
    System.out.println();
    System.out.println(c("var x = 'Do you prefer spaces or tabs?';\nvar y = 'I\'m using both here. Sue me.';\n    \t\t\t \nconsole.log(x + ' ' + y);"));
  }
}


1

Perl 6的 15  12个字节

15

{S:g/^^\h+$$//}

尝试一下

{         # bare block lambda with implicit parameter 「$_」

  S       # string replace (implicitly against 「$_」)
  :global # globally
  /
    ^^    # match beginning of line
      \h+ # match at least one horizontal whitespace
    $$    # match end of line

  //      # replace with nothing
}

11 + 1

perl6 -pe 's/^^\h+$$//'

与上述大致相同。

  • -p对输入的每一行运行代码,将其放入$_并打印$_
  • s就地替换,而S返回结果。
  • 无需:g/ :global-p需要的照顾。


1

Vim,13 9字节

:v/\S/le↵

编辑:

  • 原始答案:(:v/\S/d↵基于SO上的vim问题)。
    它删除空行,这不是预期的行为。

  • 使用vglobal的有效答案::v/\S/norm D↵

  • 现在使用left-align ex命令代替normal D


欢迎来到PPCG!我不太确定您为什么道歉,因为这本身就是一个有效的答案。
Mego

谢谢!它扩展了@ L3viathan的答案,并使用相同的“语言”,因此,如果可以的话,我会评论他的解决方案以限制(数量已经很多)答案。
摩根

我们并不是很在意有很多答案,或者有多种使用同一语言的解决方案。虽然我们鼓励评论而不是新答案,以对现有答案进行细微改进,但仍然可以发布新答案(尤其是您还不能发表评论)。
Mego

0

C,168字节

#define P putchar(*t++)
s;e(char*t){s=0;while(*t>10)if(*t!=32|*t!=9)return 0;else t++,s++;return s;}
r(char*t){while(*t==10)P;if(!*t)return;if(!e(t))while(*t)P;t+=e(t);}

详细

#include <stdio.h>

int e (char * t)
{
    int s = 0;

    // till the end of the line
    while (*t!='\0' && *t!='\n')
        // if it's not a space
        if (*t!=' ' || *t!='    ')
            // ignore the line
            return 0;
        else
            // count the space
            t++, s++;

    // return number of spaces
    return s;
}

void r (char * t)
{
    // skip to empty lines
    while (*t != '\0' && *t == '\n') putchar('\n'), t++;

    // stop at end of string
    if (*t == '\0') return;

    // if there is contnet print it
    if (!e(t)) while(*t != '\0') putchar(*t), t++;

    // skip to the end of line
    t += e(t);
}

int main (int argc, char**argv)
{
    if (argc > 1) r(argv[1]);
    putchar('\n');
    return 0;
}

0

C,100字节

c,i,j;f(char*s){for(i=j=c=0;s[i];s[++j]^10?c=s[j]^32:(printf(!c?"\n":"%.*s",j-i+1,s+i),c=0,i=j+1));}

看到它在网上工作


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.