Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I would like to start a new line after every 66 characters for any file that is input into a Ruby script.
some_string.insert( 66, "\n" )
puts some_string
shows that a new line starts after the 66th character but I need it to happen after each 66th character. In other words, each line should be 66 characters long (except possibly the last).
I'm sure it involves a regex but I've tried various with insert, scan, gsub and cannot get it to work.
I'm new to Ruby and programming and this is the first thing I've tried outside of a tutorial. Thanks for the information, all.
You could do something like this:
<your_string>.scan(/.{1,66}/).join("\n")
It will basically split <your_string> at every 66th character and then re-join it by adding the \n between each part.
Or this variation to not split words in half:
<your_string>.scan(/.{1,66} /).join("\n")
some_string.gsub(/.{66}/, "\n")
If you're interested in exploring an answer that doesn't use RegEx, try something like:
a = "Your string goes here"
d = 66
Array(0..a.length/d).collect {|j| a[j*d..(j+1)*d-1]}.join("\n")
The RegEx is likely faster, but this uses the Array Constructor, .collect and .join so it might be an interesting learning exercise. The first part generates an array of numbers based on the number of chunks (a.length/d). The collect gathers the substrings in to an array. The body of the collect generates substrings by ranges on the original string, and the join puts it back together with '\n' separators.
Use the following to split the string into an array of strings of length 66 and join those strings with a newline character.
some_string.scan(/.{1,66}/).join("\n")
Related
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
please is in ruby possible to get information from example name "Doe,Jon" (exact format) to get only the name "Jon"? Of course the name can be always different, I was thinking if is not possible to get the value from end of string to "," separator. If is it possible, how?
Thanks for your help.
So lets examine some of the solutions that are given to you in the comments
Split
"Doe,Jon".split(',').last
# or a bit more verbose
parts = "Doe,Jon".split(',') # ["Doe", "Jon"]
name = parts.last # "Jon"
String#split splits a sting into an array. It uses the parameter "," as separator. Array#last returns the last item from an array.
Gsub
"Doe,Jon".gsub(/.*,/, '')
String#gsub substitutes the part that matches the Regular Expression (/.*,/) with the substitution value ("").
The regexp matches everything (.*) up to (and including) the comma. And the replacement is an empty string, essentially deleting the part that matches the regexp.
Note that you could/should probably have an anchor to make the regexp more strict (/\A.*,/)
Slice
String#slice creates a substring given a range. -1 is a shortcut for the last element.
String#index finds the index of a character inside a String.
"Doe,Jon".slice(("Doe,Jon".index(',')+1)..-1)
# or more verbose
full = "Doe,Jon"
index_of_comma = full.index(',') # => 3
index_after_comma = index + 1
name = full.slice(index_after_comma..full.size)
CSV
CSV (Comma Separated Values) is a format where multiple values are separated by a comma (or other separation character).
require "csv"
CSV.parse("John,Doe")[0][1]
This will treat the name as CSV data and then access the first row of data (´[0]´). And from that row accesses the second element ([1]) which is the name.
Now what?
There are usually multiple ways to reach a goal. And it's up to you to pick a way. I'd go with the first one. To me it is easy to read and understand its purpose.
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
How can I write a searching command using grep that will look for a line with a strict requirements. For example it should start with a name, which consist only letters and "-", then follows an ":", then a year or "xxxx", then again an ":", and then a line of letters, digits and "-" of some length. Or may be there is a link where I can read this... I'm trying to find some solution in the Internet for a long time, but can't...
What you need here is to pass the grep command a regular expression that describes your pattern of interest, on the basis of which grep will match only valid lines.
Taking into account your indications, the following regular expression could do the job:
^([A-z]|-)+:([0-9]|xxxx)+:([A-z]|[0-9]|-)+$
The expression begins and ends with the ^ and $ anchors, that indicate the beginning and the end of a line. Then, you basically have three token blocks, separated by :, the first matching letters and dashes, the second years or xxxx, and the third letters, digits and dashes. + is a quantifier, indicating that the preceding token can appear one or more times.
You can use it with grep like so:
grep -P "^([A-z]|-)+:([0-9]|xxxx)+:([A-z]|[0-9]|-)+$"
The -P option is to indicate to interpret it as a Perl regex and correctly handle hyphens matching.
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 7 years ago.
Improve this question
i am constructing a program in Ruby which requires the value to be extracted between the 2nd and 3rd full-stop in a string.
I have searched online for various related solutions, including truncation and this prior Stack-Overflow question: Get value between 2nd and 3rd comma, however no answer illustrated a solution in the Ruby language.
Thanks in Advance.
list = my_string.split(".")
list[2]
That will do it I think. First command splits it into a list. Second gets the bit you want
You could split the string on full stops (aka periods), but that creates an array with one element for each substring preceding a full stop. If the document had, say, one million such substrings, that would be a rather inefficient way of getting just the third one.
Suppose the string is:
mystring =<<_
Now is the time
for all Rubiests
to come to the
aid of their
bowling team.
Or their frisbee
team. Or their
air guitar team.
Or maybe something
else...
_
Here are a couple of approaches you could take.
#1 Use a regular expression
r = /
(?: # start a non-capture group
.*?\. # match any character any number of times, lazily, followed by a full stop
){2} # end non-capture group and perform operation twice
\K # forget everything matched before
[^.]* # match everything up to the next full stop
/xm # extended/free-spacing regex definition mode and multiline mode
mystring[r]
#=> " Or their\nair guitar team"
You could of course write the regex:
r = /(?:.*?\.){2}\K[^.]*/m
but the extended form makes it self-documenting.
The regex engine will step through the string until it finds a match or concludes that there can be no match, and stop there.
#2 Pretend a full stop is a newline
First suppose we were looking for the third line, rather than the third substring followed by a full stop. We could write:
mystring.each_line.take(3).last.chomp
# => "to come to the"
Enumerable#take determines when a line ends by examining the input record separator, which is held by the global variable $/. By default, $/ equals a newline. We therefore could do this:
irs = $/ # save old value, normally \n
$/ = '.'
mystring.each_line.take(3).last[0..-2]
#=> " Or their\nair guitar team"
Then leave no footprints:
$/ = irs
Here String#each_line returns an enumerator (in effect, a rule for determining a sequence of values), not an array.
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I'm looking to modify a string as follows:
"one hundred forty-four".sub(/(\w+)(\s)([a-z\-]+)$/){$2 = "test"}
say.rb:78: Can't set variable $2
How can I do that?
edit: one hundredtestforty-four is what i want.
It is not allowed. It is a read only global variable.
Using another global variable name it works fine.
Of course, using global variables bring concerns of clobbering other parts of your program.
I believe you want:
"one hundred forty-four".sub(/\s+([a-z-]+)$/, 'test\1')
#=> "one hundredtestforty-four"
or
"one hundred forty-four".sub(/\s+([a-z-]+)$/, "test\\1")
#=> "one hundredtestforty-four"
or
"one hundred forty-four".sub(/\s+([a-z-]+)$/, "test"+$1)
#=> "one hundredtestforty-four"
or
"one hundred forty-four".sub(/\s+([a-z-]+)$/, "test#{$1}")
#=> "one hundredtestforty-four"
The regex looks for a string that starts with one or more spaces, then any number of lowercase letters or hypens, followed by an end-of-line. (Note the hypen is not escaped within a character class, and it must be appear first or last within the class). It therefore matches " forty-four", with capture group 1 containing "forty-four". Ergo, " forty-four" is replaced with "testforty-four". Notice that you retrieve the contents of capture group 1 by writing \1 if the string is written with single quotes, \\1 if double-quotes are used. Alternatively, you can use the global variable in one of two ways shown.
Note that, if desired, you can use $1 to reference the contents of capture group 1 in subsequent statements.
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 9 years ago.
Improve this question
I'm having some problems coming up with a regexp that matches class1, class2, and class3 in the following string (ideally I could have n number of words separated by pipes, as the number of classes passed to my method is not constant)
class1|class2|class3 path/to/resource
I have the following matcher which returns only class1. Bonus points to whomever can find me a matcher for the resource path as well.
Edit
Thank you very much for all the help - points all around!
Assuming you are confident that your input will be well formed, my advice would be to split your string by both the pipe character and space. For example:
components = "class1|class2|class3 path/to/resource".split(/[ \|]/)
You would then have access to an array containing n components followed by the path to your resource which you can manipulate to access.
resourcePath = components.pop()
classes = components
EDIT: The original topic of this was suggested the OP is using Ruby, hence my answer.
\w+(\|\w+)*\s+\w+(\/\w+)*
I assumed that the names of your classes consist of one or more word characters. Adjust if they're more restricted than that. For instance, use class\d+ for numbered classes only.
We have a class name, followed by any number of [a pipe followed by a class name]. Then we have one or more spaces, followed by basically the same thing, but this time using slashes instead of pipes.
I've escaped both the pipe and the slash with a backslash.
string = "class1|class2|class3 path/to/resource".split(%r{[| ]})
=> ["class1", "class2", "class3", "path/to/resource"]
I would just do two splits:
string = 'class1|class2|class3 path/to/resource'
p string.split.first.split('|') #=> ["class1", "class2", "class3"]
If you want to use regex with the input you provided, this will extract your classes and path:
([\w/]+)\|? ?
INPUT
class1|class2|class3 path/to/resource
OUTPUT
class1
class2
class3
path/to/resource