473,387 Members | 1,353 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Finding formatting items in a string

Hi there,

Given a standard .NET string, does anyone know what the regular expression
would be to locate each (optional) formatting item in the string (or more
likely does anyone have a link that will show me this). For instance, given
the following simple string:

"My phone number is {0} and my SSN is {1}"

I want to enumerate (or create a collection of) all formatting items in the
string which would be "{0}" and "{1}" in this (trivial) example. The regular
expression itself should handle all legal cases of course (as described
under "composite formatting" in MSDN - see here:
http://msdn2.microsoft.com/en-us/library/txafckwd.aspx). Any help would be
appreciated. Thanks.
Feb 17 '08 #1
6 1682
Hello Jack,
Hi there,

Given a standard .NET string, does anyone know what the regular
expression would be to locate each (optional) formatting item in the
string (or more likely does anyone have a link that will show me
this). For instance, given the following simple string:

"My phone number is {0} and my SSN is {1}"

I want to enumerate (or create a collection of) all formatting items
in the string which would be "{0}" and "{1}" in this (trivial)
example. The regular expression itself should handle all legal cases
of course (as described under "composite formatting" in MSDN - see
here: http://msdn2.microsoft.com/en-us/library/txafckwd.aspx). Any
help would be appreciated. Thanks.

The following expression will take care of most you want:

(?<!([^\{]|^)\{(\{{2})*)\{[0-9]+(,[-]?[0-9]+)?(:[^\}]+)?\}(?!\}(\{{2})*([^\}]|$))

I'll try to explain what it does:

(?<!([^\{]|^)\{(\{{2})*)
This part sees if we're dealing with an even number of opening {. In that
case all are escaped and should therefore be ignored.
Due to the fact that there is no easy way to check for off or even numbers
I've done it as follows:
- first make sure we're either at the beginning of a line or that we match
a character that is no {. That way we're sure where we're startign to count.
- Now chop off the first {, followed by any group of 2 extra {'s.

\{
- If that still leaves us with one {, then we're in business.

[0-9]+
- Now accept the numbered part. I've made it pretty simple here, any number
will so.

(,[-]?[0-9]+)?
- Now accept the optional alignment. I think you could write the [-] as [+-],
but I'm not sure from the top of my head that a plus is allowed for the alignment.
I guess it is though.

(:[^\}]+)?
- Accept almost anything as optional formatting mask. As you can specify
the formatting mask for each and every tipe differently based on the TypeFormatter,
I guess there's no use in limiting the possible formats any way.
- So chop off everything that's not a closing }

\}
- Pick off the closing }

(?!\}(\{{2})*([^\}]|$))
- But only if it's followed by no or an odd number of closing }'s. This used
the same logic as above.

You could make the regex more specific, but I guess this should get you started.

Also note that I haven't taken any whitespace into account, as I haven't
had time to experiment where you would be allowed to add whitespace and where
not.

If you still have any questions on how to improve or further limit the expression,
feel free to ask.

--
Jesse Houwing
jesse.houwing at sogeti.nl
Feb 18 '08 #2
Hello Jack,

I even found a FAQ on this... I'm going to write a blogpost about this pattern
at some poitn I guess. It has a lot of interesting regex things in it.

The FAQ:
http://msdn2.microsoft.com/en-us/net.../aa569608.aspx

And a further completed regex, including the fact that you can use { and
} within the custom pattern if you want to... Just escape them again. Which
makes the whole escaping { harder and harder to understand...

This is the expression I've got so far:
(?<!([^\{]|^){({{)*){(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?<format>:([^{}]|{{|}})+)?}(?!}({{)*([^}]|$))

note also that I removed the \ before most, if not all of the { and } in
the expression. It seems that the .NET regex parser is quite content with
this. Only if the {n(,(m)?)?} format is used, do you need to escape the {
and the }. I found that by accident. Not that it makes the expression any
easier to read... *sigh*...

--
Jesse Houwing
jesse.houwing at sogeti.nl
Feb 18 '08 #3
BTW, I came across this gem during my own research. You may be interested in
checking it out (it even breaks down your regex expression into plain
English)

http://www.ultrapico.com/Expresso.htm
Feb 18 '08 #4
Just an update that it looks very good so far (thanks). I haven't unravelled
the opening and closing brace (stuff) yet but I think there may be a (rare)
problem with the handling of the ":[formatString]". Any pairs of "{{" or
"}}" are valid in "formatString" if I understand the docs correctly so they
should be ignored. I'm still reviewing the situation however (and your code)
so this is just a heads-up before you start tackling your article :)
Feb 18 '08 #5
"Jack" <no_spam@_nospam.comwrote in message
news:ev**************@TK2MSFTNGP06.phx.gbl...
Just an update that it looks very good so far (thanks). I haven't
unravelled the opening and closing brace (stuff) yet but I think there may
be a (rare) problem with the handling of the ":[formatString]". Any pairs
of "{{" or "}}" are valid in "formatString" if I understand the docs
correctly so they should be ignored. I'm still reviewing the situation
however (and your code) so this is just a heads-up before you start
tackling your article :)
Ok. It appears that your expression:

(?<!([^\{]|^)\{(\{{2})*)\{(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?<format>:[^\}]+)?\}(?!\}(\{{2})*([^\}]|$))

may need to be modified slightly:

(?<!([^\{]|^)\{(\{{2})*)\{(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?<format>:([^\}]|\}{2})+)?\}(?!\}(\{{2})*([^\}]|$))

I've simply changed the "format" so that it in addition to allowing one or
more of any character except a "}" (as per your original expression), it
also now allows one or more pairs of "}}" (before the final "}" that
terminates it). I'm still digging through it all though as I rarely ever
work with regular expressions.
Feb 18 '08 #6
Hello Jack,
"Jack" <no_spam@_nospam.comwrote in message
news:ev**************@TK2MSFTNGP06.phx.gbl...
>Just an update that it looks very good so far (thanks). I haven't
unravelled the opening and closing brace (stuff) yet but I think
there may be a (rare) problem with the handling of the
":[formatString]". Any pairs of "{{" or "}}" are valid in
"formatString" if I understand the docs correctly so they should be
ignored. I'm still reviewing the situation however (and your code) so
this is just a heads-up before you start tackling your article :)
Ok. It appears that your expression:

(?<!([^\{]|^)\{(\{{2})*)\{(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?
<format>:[^\}]+)?\}(?!\}(\{{2})*([^\}]|$))

may need to be modified slightly:

(?<!([^\{]|^)\{(\{{2})*)\{(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?
<format>:([^\}]|\}{2})+)?\}(?!\}(\{{2})*([^\}]|$))

I've simply changed the "format" so that it in addition to allowing
one or more of any character except a "}" (as per your original
expression), it also now allows one or more pairs of "}}" (before the
final "}" that terminates it). I'm still digging through it all though
as I rarely ever work with regular expressions.
That would indeed solve the issue. I've been experimenting a bit more and
came to the same conclusion...

To make it even less readable, but shorter, you can remove the escapes from
the \{ and \} to make it the following expression:

(?<!([^{]|^){({{)*){(?<item>[0-9]+)(?<alignment>,[-+]?[0-9]+)?(?<format>:([^{}]|}}|{{)+)?}(?!}({{)*([^}]|$))

Also as far as I can tell the opening { must be escaped in the format pattern
as well. I adjusted the above expression for that.
--
Jesse Houwing
jesse.houwing at sogeti.nl
Feb 18 '08 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

11
by: Steve Holden | last post by:
I was messing about with formatting and realized that the right kind of object could quite easily tell me exactly what accesses are made to the mapping in a string % mapping operation. This is a...
8
by: Mr. B | last post by:
I'm writing an app where I'm trying to look for and List all specific file 'types' found. So I point to a specific start top level Folder... and I want to drill down through ALL sub folders to...
6
by: Tarun | last post by:
Hi All, I need to find a particular substring in a binary string(some text appended & prepended to binary data). I cant use strstr since it terminates on receiving '\0'which can be there in...
7
by: Matthew Wieder | last post by:
Hi - I have a datagrid that has a black header and the rows alternate white and gray. The problem is that until items are added to the grid, the grid appears as a large black rectangle, which is...
12
by: Mike Smith | last post by:
Hey anyone knows how to find an item in a list view based on text ? Cant seem to get the IndexOf method working. would the LVM_FINDITEM method using SendMessage API work in .Net ?
7
by: L. Scott M. | last post by:
Have a quick simple question: dim x as string x = "1234567890" ------------------------------------------------------- VB 6 dim y as string
1
by: Simon Forman | last post by:
I've got a function that I'd like to improve. It takes a list of lists and a "target" element, and it returns the set of the items in the lists that appear either before or after the target...
1
by: fatima.issawi | last post by:
Hello, I am creating a web page using c# and asp.net. I am trying to populate a list box by reading text from a file. The text in the file has leading spaces in order to show a hierarchy of...
7
by: Brad Baker | last post by:
I am trying to programmatically set a placeholder control in csharp which is nested inside a repeater control between <ItemTemplateand </ItemTemplate> tags, however I am running into problems. I've...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.