I want to generate HTML content in phoenix. I'm not able to use interpolation while adding name="abc". I get an error at ".
Using \ in text also shows the \, e.g. text = "This is an name=\"abc\" string" gives text = "This is an name=\"abc\" string".
Can anyone please suggest how I can have a raw string containing name="abc"?
The string does contain only name="abc", the problem is that when you see it in the terminal, Elixir escapes the double quotes, so you can copy and paste it to your code. If in doubt, use IO.puts(text), and it will print the text without doing any changes to it:
iex(1)> text = "This is an name=\"abc\" string"
"This is an name=\"abc\" string"
iex(2)> IO.puts text
This is an name="abc" string
:ok
If you want to interpolate some double quotes into a string, you might try this:
iex(1)> text = "This is a name=#{"abc"} string"
"This is a name=abc string"
That didn't work. You need to do something extra:
iex(16)> text = "This is a name=#{"\"abc\""} string"
"This is a name=\"abc\" string"
When you write something like this:
text = "This is a name="abc" string"
You should wonder how is it that elixir knows that the last quote is the quote that terminates the string. In other words, why doesn't elixir think that this is your string:
text = "This is a name="
and the rest of the line is just garbage that doesn't follow elixir's syntax? In order to tell elixir that the double quote after the = sign is not the end of the string--but that it's just another character within the string--you escape the double quote, like this:
text = "This is a name=\"abc\" string"
Now, elixir will see the double quote after string as the termination of the string.
Next, it is a complete hassle to escape double quotes within a string, so elixir provides a means of avoiding that with the ~s sigil:
iex(17)> text = ~s{This is a name="abc" string}
"This is a name=\"abc\" string"
With the ~s sigil, you can use various character pairs to surround your string, e.g. () or <> or | | or / /. You need to use a character pair that is not found within the string--otherwise you will run into the same problem as with interior double quotes.
Finally, you can prove that the string name=\"abc\" has only 10 characters, i.e. the characters name="abc", like this:
iex(13)> s1 = ~s{name="abc"}
"name=\"abc\""
iex(14)> String.length s1
10
Related
I'm trying to export email from Outlook(2010) into a CSV file, but there are emails with a comma in the subject line.
Is there a way to deal with this? I can't find an option to change the delimiter to something else.
Thanks
You can use the VBA Replace function.
Eg, this takes myString and replaces the comma with a dash.
Dim myString As String
myString = "Test subject, with comma"
myString = Replace(myString, ",", "-")
myString becomes "Test subject- with comma"
If the value contains a comma, enclose the value in quotes. If you have a quote, replace it with a double quote. E.g a value like
Weird, encoded "subject"
becomes
"Weird, encoded ""subject"""
I am working with Ruby, and I want to delete all the \ characters from my XML file.
Here is my XML file:
<w:numId w:val=\"2\"/></w:numPr></w:pPr><w:bookmarkStart w:id=\"0\" w:name=\"__DdeLink__0_226207805\"/><w:bookmarkEnd w:id=\"0\"/><w:r><w:rPr></w:rPr><w:t>Serve high quality food</w:t></w:r></w:p>, <w:p><w:pPr><w:pStyle w:val=\"style17\"/><w:numPr><w:ilvl w:val=\"0\"/><w:numId w:val=\"2\"/></w:numPr></w:pPr><w:bookmarkStart w:id=\"0\" w:name=\"__DdeLink__0_226207805\"/><w:bookmarkEnd w:id=\"0\"/>
There's actually no backslash character (\) in your file. The backslash in your example simply escapes the following double-quote and prevents it terminating the string and thereby resulting in a syntax error due to an unterminated double-quote.
What you see when you print that string in IRB is actually not the backslash as is, but the backslash in combination with the following double-quote as an indication that the double-quote is escaped. The idea is kind of hard to grasp when you encounter it the first time. Have a look at "Escape sequences".
Saying it short and sweet, there is no backslash in your file so you can't remove it.
Let me explain with an example:
> text = "This is sample text for escape character\""
#=> "This is sample text for escape character\""
Is equivalent to:
> text = 'This is sample text for escape character"'
#=> "This is sample text for escape character\""
To remove the backslash (\) , just remove "
> text.tr!('"', '')
#=> "This is sample text for escape character"
I hope this makes it clear.
Thank you guys for you answers, here is what i dit and it worked as i wanted:
text = ''
File.open("#{temp_dir}/plan_report_template/word/document.xml").each { |line|
text << line
}
open("#{temp_dir}/plan_report_template/word/document.xml", "w") { |file| file.write(text.gsub('\"', '"')) }
I'm trying to do a simple string sub in Ruby.
The second argument to sub() is a long piece of minified JavaScript which has regular expressions contained in it. Back references in the regex in this string seem to be effecting the result of sub, because the replaced string (i.e., the first argument) is appearing in the output string.
Example:
input = "string <!--tooreplace--> is here"
output = input.sub("<!--tooreplace-->", "\&")
I want the output to be:
"string \& is here"
Not:
"string & is here"
or if escaping the regex
"string <!--tooreplace--> is here"
Basically, I want some way of doing a string sub that has no regex consequences at all - just a simple string replace.
To avoid having to figure out how to escape the replacement string, use Regex.escape. It's handy when replacements are complicated, or dealing with it is an unnecessary pain. A little helper on String is nice too.
input.sub("<!--toreplace-->", Regexp.escape('\&'))
You can also use block notation to make it simpler (as opposed to Regexp.escape):
=> puts input.sub("<!--tooreplace-->") {'\&'}
string \& is here
Use single quotes and escape the backslash:
output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here"
Well, since '\\&' (that is, \ followed by &) is being interpreted as a special regex statement, it stands to reason that you need to escape the backslash. In fact, this works:
>> puts 'abc'.sub 'b', '\\\\&'
a\&c
Note that \\\\& represents the literal string \\&.
How can I escape single and double quotes in a string?
I want to escape single and double quotes together. I know how to pass them separately but don't know how to pass both of them.
e.g: str = "ruby 'on rails" " = ruby 'on rails"
My preferred way is to not worry about escaping and instead use %q, which behaves like a single-quote string (no interpolation or character escaping), or %Q for double quoted string behavior:
str = %q[ruby 'on rails" ] # like single-quoting
str2 = %Q[quoting with #{str}] # like double-quoting: will insert variable
See https://docs.ruby-lang.org/en/trunk/syntax/literals_rdoc.html#label-Strings and search for % strings.
Use backslash to escape characters
str = "ruby \'on rails\" "
Here is a complete list:
From http://learnrubythehardway.org/book/ex10.html
You can use Q strings which allow you to use any delimiter you like:
str = %Q|ruby 'on rails" " = ruby 'on rails|
>> str = "ruby 'on rails\" \" = ruby 'on rails"
=> "ruby 'on rails" " = ruby 'on rails"
I would go with a heredoc if I'm starting to have to worry about escaping. It will take care of it for you:
string = <<MARKER
I don't have to "worry" about escaping!!'"!!
MARKER
MARKER delineates the start/end of the string. start string on the next line after opening the heredoc, then end the string by using the delineator again on it's own line.
This does all the escaping needed and converts to a double quoted string:
string
=> "I don't have to \"worry\" about escaping!!'\"!!\n"
I would use just:
str = %(ruby 'on rails ")
Because just % stands for double quotes(or %Q) and allows interpolation of variables on the string.
Here is an example of how to use %Q[] in a more complex scenario:
%Q[
<meta property="og:title" content="#{#title}" />
<meta property="og:description" content="#{#fullname}'s profile. #{#fullname}'s location, ranking, outcomes, and more." />
].html_safe
One caveat:
Using %Q[] and %q[] for string comparisons is not intuitively safe.
For example, if you load something meant to signify something empty, like "" or '', you need to use the actual escape sequences. For example, let's say qvar equals "" instead of any empty string.
This will evaluate to false
if qvar == "%Q[]"
As will this,
if qvar == %Q[]
While this will evaluate to true
if qvar == "\"\""
I ran into this issue when sending command-line vars from a different stack to my ruby script. Only Gabriel Augusto's answer worked for me.
I am trying to construct a regex to find a string in ruby
str = "foo"
I want to be able to stop trying to find the string after it finds the closing quotation mark. I also want to keep the quotation marks so I can output the string I found as:
puts "the string is:" + str
=> the string is: "foo"
I am pretty new to using regular expressions.
Here is a start:
/".*?"/
Explanation:
" Match a literal double quote.
.*? Match any characters, as few as possible (non-greedy)
" Match a second literal double quote.
Rubular
Note that this won't work if the string contains escaped quotes or is quoted with single quotes.