caleb-bb

caleb-bb

Regex.scan and repeated words

So I define my regex like so:

{:ok, reg} = Regex.compile("^#{word} | #{word}$|^#{word}$| #{word} ")

With word = "go"

Then I run

Regex.scan(reg, "go go gordon go") |> List.flatten

And I’m expecting to get ["go", " go ", " go"] but instead I get ["go ", " go"].

What am I doing wrong? Does it have to do with how the regex is organized? I’m doing it like this to avoid matching the go in gordon.

Marked As Solved

lucaong

lucaong

You have four alternatives in your regexp:

  1. The word at the beginning of the string, then a space
  2. A space, then the word at the end of the string
  3. The word at the beginning of the string, then the end of the string
  4. A space, the word, then another space

When you scan go go gordon go the following things happen: rule 1 matches go , the second go doesn’t match because it’s neither at the beginning, nor at the end, nor it has a space before AND after (the space before was already consumed by the first match), gordon as expected doesn’t match, finally the last go matches rule 2.

In fact, if you had a second space after the first go you would get the match you expect.

One possible way to match all the “go” that are not part of another word is ~r/\bgo\b/ (the \b represents a word boundary). It is not equivalent to your expectation, because it does not return spaces in the matches, but maybe it is what you ultimately want?

word = "go"
{:ok, reg} = Regex.compile("\\b#{word}\\b")
Regex.scan(reg, "go go gordon go") |> List.flatten()
# => ["go", "go", "go"]

Also Liked

trisolaran

trisolaran

Yep, @lucaong explained what’s going on. To solve the problem, I was about to suggest using negative lookahead + lookbehind, like this:

~r/(?<![^\s])go(?![^\s])/

This works but @lucaong’s solution using \b is way more elegant

caleb-bb

caleb-bb

Marking this one as solution because it explains the “why” behind the issue very well. You even saw through my clumsy coding and understood my underlying intention. Thank you! And thanks to @trisolaran as well.

Where Next?

Popular in Questions Top

JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
sacepums
Hey guys. I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 27727 240
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 42633 214
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement