我不确定这是解决这个问题的正确方法,但我正在进入正则表达式两天。使用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")
感谢您的帮助!
答案 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"]
我在开始时有这个,不是确切的模式,而是正确的输出。无论如何,感谢所有的帮助!