Home > OS >  How to match a string exactly OR exact substring from beginning using Regular Expression
How to match a string exactly OR exact substring from beginning using Regular Expression

Time:09-01

I'm trying to build a regex query for a database and it's got me stumped. If I have a string with a varying number of elements that has an ordered structure how can I find if it matches another string exactly OR some exact sub string when read from the left?

For example I have these strings

  1. Canada.Ontario.Toronto.Downtown
  2. Canada.Ontario
  3. Canada.EasternCanada.Ontario.Toronto.Downtown
  4. England.London
  5. France.SouthFrance.Nice

They are structured by most general location to specific, left to right. However, the number of elements varies with some specifying a country.region.state and so on, and some just country.town. I need to match not only the words but the order.

So if I want to match "Canada.Ontario.Toronto.Downtown" I would want to both get #1 and #2 and nothing else. How would I do that? Basically running through the string and as soon as a different character comes up it's not a match but still allow a sub string that ends "early" to match like #2.

I've tried making groups and using "?" like (canada)?.?(Ontario)?.? etc but it doesn't seem to work in all situations since it can match nothing as well.

Edit as requested: Mongodb Database Collection:

[
    {
        "_id": "doc1",
        "context": "Canada.Ontario.Toronto.Downtown",
        "useful_data": "Some Data"
    },
    {
        "_id": "doc2",
        "context": "Canada.Ontario",
        "useful_data": "Some Data"
    },
    {
        "_id": "doc3",
        "context": "Canada.EasternCanada.Ontario.Toronto.Downtown",
        "useful_data": "Some Data"
    },
    {
        "_id": "doc4",
        "context": "England.London",
        "useful_data": "Some Data"
    },
    {
        "_id": "doc5",
        "context": "France.SouthFrance.Nice",
        "useful_data": "Some Data"
    },
    {
        "_id": "doc6",
        "context": "",
        "useful_data": "Some Data"
    }
]

User provides "Canada", "Ontario", "Toronto", and "Downtown" values in that order and I need to use that to query doc1 and doc2 and no others. So I need a regex pattern to put in here: collection.find({"context": {$regex: <pattern here>}) If it's not possible I'll just have to restructure the data and use different methods of finding those docs.

CodePudding user response:

At each dot, start an nested optional group for the next term, and add start and end anchors:

^Canada(\.Ontario(\.Toronto(\.Downtown)?)?)?$

See live demo.

  • Related