Убедитесь, что ваш движок регулярных выражений поддерживает \R
в качестве сокращенного класса символов, и вам не нужно беспокоиться о различных комбинациях перевода строки / перевода строки Unicode. Если все реализовано правильно, вы можете прозрачно сопоставить все различные окончания строк ascii или Unicode, используя \R
.
В Unicode вам нужно обнаружить NEL
(конец строки OS / 390, \ x85) LS
(разделитель строк, \ x2028) и PS
(разделитель абзацев, \ x2029), если вы хотите быть полностью кроссплатформенным в эти дни.
Это спорно ли LS, NEL, и PS следует рассматривать как разрыв строки, строки окончания или белое пространство. Стандарт XML 1.0, например, , не распознает NEL как символ перевода строки. ECMAScript рассматривает LS
и PS
как разрывы строк, но NEL
как пробелы. Регулярные выражения Perl unicode будут обрабатывать VT
, FF
, CR
, CRLF
, NEL
, LS
и PS
как разрывы строк для целей ^
и $
регулярные выражения метасимволов.
Руководство по внедрению Unicode (раздел 5.8 и таблица 5.3), вероятно, является лучшим выбором для окончательного подхода к пониманию «новой строки».
Если вас интересует только ascii с классическими вариантами DOS / Windows / Unix / Mac, регулярное выражение, эквивалентное \R
, равно (?>\r\n|[\r\n])
В Unicode, эквивалентно \R
] (?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029)
\x0b
там есть вертикальная вкладка; еще раз, это может соответствовать или не соответствовать вашему определению, что такое разрыв строки, но это соответствует рекомендации имплантации Unicode. (FF
или \x0C
не включены в регулярное выражение, так как фид форм - это новая страница, а не новая строка в определении.)
Хорошо, после некоторых довольно хороших идей от Торстена Дитмара я, наконец, заставил эту штуку работать. Некоторые вещи, которые возникли во время нашего обсуждения, и другие вещи, которые я нашел в сети:
В AssemblyInfo.cs убедитесь, что вы установили
[сборка: ComVisible ( true )]
Как указал Торстен, вам необходимо иметь открытый конструктор без параметров в вашем классе .Net.
Зарегистрируйтесь вашу DLL на целевой машине, выполнив эту команду. Параметр / codebase , похоже, помог мне. Путь к библиотеке типов (.tlb) или DLL значения не имеет. Вы можете найти regasm в C: \ Windows \ Microsoft.Net \ Framework \ v2.050727 \ RegAsm.exe
regasm c: \ CompanyName.Net.dll /tlb:CompanyName.Net.tlb / codebase
] Укажите ссылку на файл .tlb в редакторе VBA, выбрав Инструменты> Ссылки.
Вам нужен явный конструктор без параметров в вашем классе COM. Измените определение класса на:
namespace CompanyName.Net
{
[Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("CompanyName.Net.Webrequest")]
public class WebRequest
{
public string Result { get; private set; }
public string Url { get; set; }
public string StatusDescription { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public WebRequest()
{
}
public string GetResponse(string url)
{
System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse) webreq.GetResponse();
// Store the status.
StatusDescription = response.StatusDescription;
StatusCode = response.StatusCode;
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
Result = reader.ReadToEnd();
// Cleanup the streams and the response.
reader.Close();
dataStream.Close();
response.Close();
//return the response
return Result;
}
}
}
Это должно сработать.