使用gsub和regex替换外部双引号

时间:2017-07-21 22:42:37

标签: ruby regex

我不确定这是解决这个问题的正确方法,但我正在进入正则表达式两天。使用Rubular中的模式,或者使用Ruby匹配或扫描,我看到正确的字符匹配。问题是我无法弄清楚为什么 外部双引号未被替换。

scanf()

应该归还:

#include <stdio.h>

int cadena(const char *ciudad, char letra) {
    int i;
    int count = 0;

    for (i = 0; ciudad[i] != '\0'; i++) {
        if (ciudad[i] == letra)
            count += 1;
    }
    return count;
}

int main(void) {
    char ciudad_1[50];
    char letra_1;

    printf("Dame tu ciudad: ");
    if (scanf("%49[^\n]", ciudad_1) != 1)
        return 1;
    printf("Dame la letra la cual quieres contar: ");
    if (scanf(" %c", &letra_1) != 1)
        return 1;

    printf("Esta son las veces que se repite tu letra: %d\n",
           cadena(ciudad_1, letra_1));
    return 0;
}

相反,我得到了这个 -

def fields(fos)
  fos.gsub(/("*)(\W+)/, "', '")
end

p fields("Pete,201,Student")
p fields("Pete \t 201    ,  TA")
p fields("Pete \t 201")

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

外部双引号仅由ruby用于表示 String 对象,因此您将无法替换它们(并且不需要)

但似乎您正在尝试设置数组(例如['Pete', '201', 'Student']是一个包含三个字符串的数组),因此您可以使用split,如下所示:

def fields(fos)
  fos.split(/[,|\s]+/)
end

p fields("Pete,201,Student")
# ["Pete", "201", "Student"]

p fields("Pete \t 201    ,  TA")
# ["Pete", "201", "TA"]

p fields("Pete \t 201")
# ["Pete", "201"]

答案 1 :(得分:1)

假设:

tests=["Pete,201,Student","Pete \t 201    ,  TA","Pete \t 201"]

您可以使用split

的正则表达式
> tests.map {|e| e.split(/[,\t ]+/) }
=> [["Pete", "201", "Student"], ["Pete", "201", "TA"], ["Pete", "201"]]

split定位分隔字段的元素,在本例中为空格或制表符或逗号的运行。

split用于指定不是您的数据 - 在这种情况下,您的数据不是空格或制表符或逗号。

您还可以使用正则表达式来捕获您的数据IS - 在这种情况下,单词和数字:

> s="Pete,201,Student"
> s.scan(/[a-zA-Z\d]+/)
=> ["Pete", "201", "Student"]

或者,对于拉丁语和非拉丁字母:

> s.scan(/[\p{L}\d]+/)
=> ["Pete", "201", "Student"]

您还可以通过使用否定字符类[^]来指定数据不是什么,并使用它来捕获不是逗号,空格或制表符的内容:

> s.scan(/[^\t ,]+/)
=> ["Pete", "201", "Student"]

旁注:

你的问题(以及我的回答)含糊不清:

"Pete \t 201 , TA"开始,您需要三个字段:['Pete', '201', 'TA']

您对"A,,,,B,,,,C"的期望是什么? "A\tB\t\tC"怎么样?那么'"A,B",C,"D,E,F"'呢?

通常的自定义是:

"A,,,,B,,,,C"      => ["A","","","B","","","C"]
"A\tB\t\tC"        => ["A","B","","C"]
'"A,B",C,"D,E,F"'  => [""A,B","C","D,E,F"]

如果您希望,\t的处理方式与空格的运行方式不同,或者您希望引用字段中的逗号处理方式不同,则会很快变得复杂。最终,建议使用CSV module

但是,如果你可以忽略完全像'"A,B",C,"D,E,F"'这样的引用字段,并希望空格的运行与单个逗号区别对待,你可以这样做:

> tests=["Pete,201,Student","Pete \t 201    ,  TA","Pete \t 201", "A,,,B,,,C"]
> tests.map {|e| e.split(/[,]|[\t ]+/) }
=> [["Pete", "201", "Student"], ["Pete", "201", "", "", "TA"], ["Pete", "201"], ["A", "", "", "B", "", "", "C"]]

但是这与您的示例不同,因为您将逗号视为空格或制表符的等效分隔符。通常,这三者的处理方式不同。

答案 2 :(得分:1)

如上所述,双引号不是字符串的一部分,如果你的字符串包含dooble引号,它应该像'"Pete,201,Student"'"\"Pete,201,Student\"",如果你想拆分字符串(成为数组[] )使用分隔符非字母数字字符使用\W

def fields(fos)
  fos.split(/\W+/)
end

p fields('Pete,201,Student')
# ["Pete", "201", "Student"]

p fields("Pete \t 201    ,  TA")
# ["Pete", "201", "TA"]

p fields("Pete \n $%^^ 201")
# ["Pete", "201"]

答案 3 :(得分:0)

我被骗了!这是一个练习,问题中打印的预期输出是数组中的单引号字符串。我终于开始了,看看他们的解决方案

def fields(fos)
  fos.split(/[ \t,]+/)
end

p fields("Pete,201,Student")
# -> ['Pete', '201', 'Student']

p fields("Pete \t 201    ,  TA")
# -> ['Pete', '201', 'TA']

p fields("Pete \t 201")
# -> ['Pete', '201']

输出:

["Pete", "201", "Student"]
["Pete", "201", "TA"]
["Pete", "201"]

我在开始时有这个,不是确切的模式,而是正确的输出。无论如何,感谢所有的帮助!