473,881 Members | 1,694 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

A nice way to use regex for complicate parsing


My goal is to write a parser for these imaginary string from the SMTP
protocol, regarding RFC 821 and 1869.
I'm a little flexible with the BNF from these RFC :-)
Any comment ?

tests=[ 'MAIL FROM:<jo******* *@address.com>' ,
'MAIL FROM:jo******** @address.com',
'MAIL FROM:<jo******* *@address.comSI ZE=1234
OT*******@bar.c om',
'MAIL FROM:jo******** @address.com SIZE=1234
OT*******@bar.c om',
'MAIL FROM:<"th**@is. alegal=email"@a ddress.com>',
'MAIL FROM:"th**@is.a legal=email"@ad dress.com',
'MAIL FROM:<"th**@is. alegal=email"@a ddress.comSIZE= 1234
OT*******@bar.c om',
'MAIL FROM:"th**@is.a legal=email"@ad dress.com SIZE=1234
OT*******@bar.c om',
]

def RN(name, regex):
"""protect using () and give an optional name to a regex"""
if name:
return r'(?P<%s>%s)' % (name, regex)
else:
return r'(?:%s)' % regex
regex={}

# <dotnum::= <snum"." <snum"." <snum"." <snum>
regex['dotnum']=RN(None, r'[012]?\d?\d\.[012]?\d?\d\.[012]?\d?\d\.
[012]?\d?\d' % regex)
# <dot-string::= <string| <string"." <dot-string>
regex['dot_string']=RN(None, r'[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*' %
regex)
# <domain::= <element| <element"." <domain>
regex['domain']=RN('domain', r'%(dotnum)s|%( dot_string)s' % regex)
# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
regex['q']=RN(None, r'[^\n\r"\\]' % regex)
# <x::= any one of the 128 ASCII characters (no exceptions)
regex['x']=RN(None, r'.' % regex)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
regex['qtext']=RN(None, r'(?:\\%(x)s|%( q)s)+' % regex)
# <quoted-string::= """ <qtext"""
regex['quoted_string']=RN('quoted_str ing', r'"%(qtext)s" ' % regex)
# <local-part::= <dot-string| <quoted-string>
regex['local_part']=RN('local_part ', r'%(quoted_stri ng)s|%
(dot_string)s' % regex)
# <mailbox::= <local-part"@" <domain>
regex['mailbox']=RN('mailbox', r'%(local_part) s@%(domain)s' % regex)
# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
regex['path']=RN('path', r'(?P<path_lt>< )?%(mailbox)s(? (path_lt)>)' %
regex)
# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
regex['esmtp_keyword']=RN(None, r'[a-zA-Z0-9][-a-zA-Z0-9]*' % regex)
# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all ;
syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
regex['esmtp_value']=RN(None, r'[^= \t\r\n\f\v]*' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_paramete r']=RN(None, r'%(esmtp_keywo rd)s(?:=%
(esmtp_value)s) ?' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_paramete rs']=RN('esmtp_para meters', r'%
(esmtp_paramete r)s(?:\s+%(esmt p_parameter)s)+ ' % regex)
# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
regex['esmtp_addr']=RN('esmtp_addr ', r'%(path)s(?:\s +%
(esmtp_paramete rs)s)?' % regex)

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyw ord)
if t[:keylen].upper()==keywo rd:
t=t[keylen:]
break

match=re.match( regex['esmtp_addr'], t)
if match:
print 'MATCH local_part=%(lo cal_part)s domain=%(domain )s
esmtp_parameter s=%(esmtp_param eters)s' % match.groupdict ()
else:
print 'DONT match', t

Mar 29 '07 #1
3 2710
It would be worth learning pyparsing to do this.

aspineux wrote:
My goal is to write a parser for these imaginary string from the SMTP
protocol, regarding RFC 821 and 1869.
I'm a little flexible with the BNF from these RFC :-)
Any comment ?

tests=[ 'MAIL FROM:<jo******* *@address.com>' ,
'MAIL FROM:jo******** @address.com',
'MAIL FROM:<jo******* *@address.comSI ZE=1234
OT*******@bar.c om',
'MAIL FROM:jo******** @address.com SIZE=1234
OT*******@bar.c om',
'MAIL FROM:<"th**@is. alegal=email"@a ddress.com>',
'MAIL FROM:"th**@is.a legal=email"@ad dress.com',
'MAIL FROM:<"th**@is. alegal=email"@a ddress.comSIZE= 1234
OT*******@bar.c om',
'MAIL FROM:"th**@is.a legal=email"@ad dress.com SIZE=1234
OT*******@bar.c om',
]

def RN(name, regex):
"""protect using () and give an optional name to a regex"""
if name:
return r'(?P<%s>%s)' % (name, regex)
else:
return r'(?:%s)' % regex
regex={}

# <dotnum::= <snum"." <snum"." <snum"." <snum>
regex['dotnum']=RN(None, r'[012]?\d?\d\.[012]?\d?\d\.[012]?\d?\d\.
[012]?\d?\d' % regex)
# <dot-string::= <string| <string"." <dot-string>
regex['dot_string']=RN(None, r'[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*' %
regex)
# <domain::= <element| <element"." <domain>
regex['domain']=RN('domain', r'%(dotnum)s|%( dot_string)s' % regex)
# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
regex['q']=RN(None, r'[^\n\r"\\]' % regex)
# <x::= any one of the 128 ASCII characters (no exceptions)
regex['x']=RN(None, r'.' % regex)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
regex['qtext']=RN(None, r'(?:\\%(x)s|%( q)s)+' % regex)
# <quoted-string::= """ <qtext"""
regex['quoted_string']=RN('quoted_str ing', r'"%(qtext)s" ' % regex)
# <local-part::= <dot-string| <quoted-string>
regex['local_part']=RN('local_part ', r'%(quoted_stri ng)s|%
(dot_string)s' % regex)
# <mailbox::= <local-part"@" <domain>
regex['mailbox']=RN('mailbox', r'%(local_part) s@%(domain)s' % regex)
# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
regex['path']=RN('path', r'(?P<path_lt>< )?%(mailbox)s(? (path_lt)>)' %
regex)
# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
regex['esmtp_keyword']=RN(None, r'[a-zA-Z0-9][-a-zA-Z0-9]*' % regex)
# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all ;
syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
regex['esmtp_value']=RN(None, r'[^= \t\r\n\f\v]*' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_paramete r']=RN(None, r'%(esmtp_keywo rd)s(?:=%
(esmtp_value)s) ?' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_paramete rs']=RN('esmtp_para meters', r'%
(esmtp_paramete r)s(?:\s+%(esmt p_parameter)s)+ ' % regex)
# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
regex['esmtp_addr']=RN('esmtp_addr ', r'%(path)s(?:\s +%
(esmtp_paramete rs)s)?' % regex)

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyw ord)
if t[:keylen].upper()==keywo rd:
t=t[keylen:]
break

match=re.match( regex['esmtp_addr'], t)
if match:
print 'MATCH local_part=%(lo cal_part)s domain=%(domain )s
esmtp_parameter s=%(esmtp_param eters)s' % match.groupdict ()
else:
print 'DONT match', t

--
Shane Geiger
IT Director
National Council on Economic Education
sg*****@ncee.ne t | 402-438-8958 | http://www.ncee.net

Leading the Campaign for Economic and Financial Literacy
Mar 29 '07 #2
On Mar 29, 9:42 am, Shane Geiger <sgei...@ncee.n etwrote:
It would be worth learning pyparsing to do this.
Thanks to Shane and Steven for the ref to pyparsing. I also was
struck by this post, thinking "this is pyparsing written in re's and
dicts".

The approach you are taking is *very* much like the thought process I
went through when first implementing pyparsing. I wanted to easily
compose expressions from other expressions. In your case, you are
string interpolating using a cumulative dict of prior expressions.
Pyparsing uses various subclasses of the ParserElement class, with
operator definitions for alternation ("|" or "^" depending on non-
greedy vs. greedy), composition ("+"), and negation ("~"). Pyparsing
also uses its own extended results construct, ParseResults, which
supports named results fields, accessible using list indicies, dict
names, or instance names.

Here is the pyparsing treatment of your example (I may not have gotten
every part correct, but my point is more the similarity of our
approaches). Note the access to the smtp parameters via the Dict
transformer.

-- Paul
from pyparsing import *

# <dotnum::= <snum"." <snum"." <snum"." <snum>
intgr = Word(nums)
dotnum = Combine(intgr + "." + intgr + "." + intgr + "." + intgr)

# <dot-string::= <string| <string"." <dot-string>
string_ = Word(alphanums)
dotstring = Combine(delimit edList(string_, "."))

# <domain::= <element| <element"." <domain>
domain = dotnum | dotstring

# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
# <x::= any one of the 128 ASCII characters (no exceptions)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
# <quoted-string::= """ <qtext"""
quotedString = dblQuotedString # <- just use pre-defined expr from
pyparsing

# <local-part::= <dot-string| <quoted-string>
localpart = (dotstring | quotedString).s etResultsName(" localpart")

# <mailbox::= <local-part"@" <domain>
mailbox = Combine(localpa rt + "@" + domain).setResu ltsName("mailbo x")

# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
path = "<" + mailbox + ">" | mailbox

# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
esmtpkeyword = Word(alphanums, alphanums+"-")

# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all
esmtpvalue = Regex(r'[^= \t\r\n\f\v]*')

# ; syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
esmtpparameters = Dict(
ZeroOrMore( Group(esmtpkeyw ord + Suppress("=") + esmtpvalue) ) )

# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
esmtp_addr = path + \
Optional(esmtpp arameters,defau lt=[])\
.setResultsName ("parameters ")

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyw ord)
if t[:keylen].upper()==keywo rd:
t=t[keylen:]
break

try:
match = esmtp_addr.pars eString(t)
print 'MATCH'
print match.dump()
# some sample code to access elements of the parameters
"dict"
if "SIZE" in match.parameter s:
print "SIZE is", match.parameter s.SIZE
print
except ParseException, pe:
print 'DONT match', t

prints:
MATCH
['<', ['johnsmith@addr esscom'], '>']
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: []

MATCH
[['johnsmith@addr esscom']]
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: []

MATCH
['<', ['johnsmith@addr esscom'], '>', ['SIZE', '1234'], ['OTHER',
'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['johnsmith@addr esscom'], ['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
['<', ['"to*@is.alegal =email"@address com'], '>']
- mailbox: ['"to*@is.alegal =email"@address com']
- localpart: "to*@is.alegal= email"
- parameters: []

MATCH
[['"to*@is.alegal =email"@address com']]
- mailbox: ['"to*@is.alegal =email"@address com']
- localpart: "to*@is.alegal= email"
- parameters: []

MATCH
['<', ['"to*@is.alegal =email"@address com'], '>', ['SIZE', '1234'],
['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['"to*@is.alegal =email"@address com']
- localpart: "to*@is.alegal= email"
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['"to*@is.alegal =email"@address com'], ['SIZE', '1234'], ['OTHER',
'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['"to*@is.alegal =email"@address com']
- localpart: "to*@is.alegal= email"
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

Mar 29 '07 #3
On 29 mar, 17:33, "Paul McGuire" <p...@austin.rr .comwrote:
On Mar 29, 9:42 am, Shane Geiger <sgei...@ncee.n etwrote:
It would be worth learning pyparsing to do this.

Thanks to Shane and Steven for the ref to pyparsing. I also was
struck by this post, thinking "this is pyparsing written in re's and
dicts".
My first idea was : why learn a parsing library if I can do it using
're'
and dicts :-)
>
The approach you are taking is *very* much like the thought process I
went through when first implementing pyparsing. I wanted to easily
compose expressions from other expressions. In your case, you are
string interpolating using a cumulative dict of prior expressions.
Pyparsing uses various subclasses of the ParserElement class, with
operator definitions for alternation ("|" or "^" depending on non-
greedy vs. greedy), composition ("+"), and negation ("~"). Pyparsing
also uses its own extended results construct, ParseResults, which
supports named results fields, accessible using list indicies, dict
names, or instance names.

Here is the pyparsing treatment of your example (I may not have gotten
every part correct, but my point is more the similarity of our
approaches). Note the access to the smtp parameters via the Dict
transformer.

-- Paul
Thanks !

Any parsing library I used before were heavy to start with.
The benefit was inversely proportional to the size of the project.
Your look to be lighter, and the results are more easily usable.

Thanks for showing me your lib.

Anyway today I will keep my idea for small parsing.
Alain

>
from pyparsing import *

# <dotnum::= <snum"." <snum"." <snum"." <snum>
intgr = Word(nums)
dotnum = Combine(intgr + "." + intgr + "." + intgr + "." + intgr)

# <dot-string::= <string| <string"." <dot-string>
string_ = Word(alphanums)
dotstring = Combine(delimit edList(string_, "."))

# <domain::= <element| <element"." <domain>
domain = dotnum | dotstring

# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
# <x::= any one of the 128 ASCII characters (no exceptions)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
# <quoted-string::= """ <qtext"""
quotedString = dblQuotedString # <- just use pre-defined expr from
pyparsing

# <local-part::= <dot-string| <quoted-string>
localpart = (dotstring | quotedString).s etResultsName(" localpart")

# <mailbox::= <local-part"@" <domain>
mailbox = Combine(localpa rt + "@" + domain).setResu ltsName("mailbo x")

# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
path = "<" + mailbox + ">" | mailbox

# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
esmtpkeyword = Word(alphanums, alphanums+"-")

# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all
esmtpvalue = Regex(r'[^= \t\r\n\f\v]*')

# ; syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
esmtpparameters = Dict(
ZeroOrMore( Group(esmtpkeyw ord + Suppress("=") + esmtpvalue) ) )

# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
esmtp_addr = path + \
Optional(esmtpp arameters,defau lt=[])\
.setResultsName ("parameters ")

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyw ord)
if t[:keylen].upper()==keywo rd:
t=t[keylen:]
break

try:
match = esmtp_addr.pars eString(t)
print 'MATCH'
print match.dump()
# some sample code to access elements of the parameters
"dict"
if "SIZE" in match.parameter s:
print "SIZE is", match.parameter s.SIZE
print
except ParseException, pe:
print 'DONT match', t

prints:
MATCH
['<', ['johnsmith@addr esscom'], '>']
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: []

MATCH
[['johnsmith@addr esscom']]
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: []

MATCH
['<', ['johnsmith@addr esscom'], '>', ['SIZE', '1234'], ['OTHER',
'...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['johnsmith@addr esscom'], ['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addr esscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
['<', ['"t...@is.alega l=email"@addres scom'], '>']
- mailbox: ['"t...@is.alega l=email"@addres scom']
- localpart: "t...@is.alegal =email"
- parameters: []

MATCH
[['"t...@is.alega l=email"@addres scom']]
- mailbox: ['"t...@is.alega l=email"@addres scom']
- localpart: "t...@is.alegal =email"
- parameters: []

MATCH
['<', ['"t...@is.alega l=email"@addres scom'], '>', ['SIZE', '1234'],
['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['"t...@is.alega l=email"@addres scom']
- localpart: "t...@is.alegal =email"
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['"t...@is.alega l=email"@addres scom'], ['SIZE', '1234'], ['OTHER',
'...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['"t...@is.alega l=email"@addres scom']
- localpart: "t...@is.alegal =email"
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

Mar 30 '07 #4

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

Similar topics

3
2093
by: Jon Maz | last post by:
Hi All, Am getting frustrated trying to port the following (pretty simple) function to CSharp. The problem is that I'm lousy at Regular Expressions.... //from http://support.microsoft.com/default.aspx?scid=kb;EN-US;246800 function fxnParseIt() { var sInputString = 'asp and database';
3
2263
by: Natalia DeBow | last post by:
Hi there, I have another question for .NET RegEx experts. I am reading in a C Sharp file line by line and I am trying to detect comments that start with either // of ///. What I am particularly interested is the comments themselves. I am interested in some stats with regards to the amount of comments in the file (comment bytes). So, I tried several regular expressions, but they don't seem to work in
4
4554
by: Brian Henry | last post by:
I have phone numbers like this in a data table 123-435-1234 1231231234 432.234.2321 they all have different formatting, what I want to do is get them all formatted like this (123) 123-1234
13
2387
by: Chris Lieb | last post by:
I am trying to write a regex that will parse BBcode into HTML using JavaScript. Everything was going smoothly using the string class replace() operator with regex's until I got to the list tag. Implementing the list tag itself was fairly easy. What was not was trying to handle the list items. For some reason, in BBcode, they didn't bother defining an end tag for a list item. I guess that they designed it with bad old HTML 3.2 in mind...
24
14427
by: cassetti | last post by:
Here's the issue: I have roughly 20 MS excel spreadsheets, each row contains a record. These records were hand entered by people in call centers. The problem is, there can and are duplicate phone numbers, and emails and addresses even person names. I need to sift through all this data (roughly 300,000+ records and use fuzzy logic to break it down, so that i have only unique records.
17
2798
by: Mark | last post by:
I must create a routine that finds tokens in small, arbitrary VB code snippets. For example, it might have to find all occurrences of {Formula} I was thinking that using regular expressions might be a neat way to solve this, but I am new to them. Can anyone give me a hint here? The catch is, it must only find tokens that are not quoted and not commented; examples follow
16
2259
by: Mark Chambers | last post by:
Hi there, I'm seeking opinions on the use of regular expression searching. Is there general consensus on whether it's now a best practice to rely on this rather than rolling your own (string) pattern search functions. Where performance is an issue you can alway write your own specialized routine of course. However, for the occasional pattern search where performance isn't an issue, would most seasoned .NET developers rely on "Regex" and...
4
2679
by: CJ | last post by:
Is this the format to parse a string and return the value between the item? Regex pRE = new Regex("<File_Name>.*>(?<insideText>.*)</File_Name>"); I am trying to parse this string. <File_Name>Services</File_Name> Thanks
4
337
by: AMP | last post by:
Hello, I have a Regex: Regex regex = new Regex(@"22 22 22 22 22 22 22 22 22 22(? <centervalue>.+)33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33"); Sometimes my data has 10 sets of "22"'s , sometimes 12, 14 ,ect. I want the centervalue to start after ALL of the "22"'s but this is not happening. Once it see's the 10 sets it starts there, but I want it to start at
0
9926
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, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10715
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
7952
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
7105
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5780
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5974
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4597
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4194
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3221
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.